Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PHP - Lista aninhada quebrada em colunas pares (correção e atualizações)


Você não mostrou em suas duas perguntas o que é a tabela do banco de dados, então não posso responder especificamente, mas vou esboçar minha sugestão.

Você pode fazer uso de funções de agregação no mysql para obter suas entradas de notícias ordenadas e agrupadas por tópicos incl. sua contagem. Você pode fazer duas consultas para obter as contagens primeiro, isso depende um pouco de como você gostaria de lidar com seus dados.

De qualquer forma, usando o mysql_... funções, todos os dados que você selecionou do banco de dados estarão na memória (até duas vezes devido a internos). Portanto, ter outro array como na sua pergunta anterior não deve doer muito graças à cópia na otimização de gravação em PHP. Apenas uma pequena sobrecarga de forma eficaz.

Além disso, antes de cuidar da saída real, você deve colocar seus dados em ordem para não precisar misturar manipulação de dados e lógica de saída. A mistura torna as coisas mais complicadas, portanto, mais difíceis de resolver. Por exemplo, se você colocar sua saída em funções simples, isso fica mais fácil:
function render_list($title, array $entries)
{
    echo '<ul><li>', $title, '<ul>';
    foreach($entries as $entry)
    {
        echo '<li>', $entry['NewsID'], '</li>';
    }
    echo '</ul></li></ul>;
}

function render_column(array $topics)
{
    echo '<div class="column">';
    foreach($topics as $topic)
    {
        render_list($topic['title'], $topic['entries']);
    }
    echo '</div>';
}

Isso já resolve seu problema de saída, então não precisamos mais nos preocupar com isso. Só precisamos nos preocupar com o que alimentar essas funções como parâmetros.

Os tópicos X por variante de coluna:

Com esta variante os dados devem ser um array com um tópico por valor, como você fez com a pergunta anterior. Eu diria que já está resolvido. Não sei qual problema concreto você tem com o número de colunas, o cálculo parece bom, então eu pulo isso até que você forneça informações concretas sobre isso. "Não funciona" não se qualifica.

Os X itens de notícias por variante de coluna:

Isso é mais interessante. Um movimento fácil aqui é continuar o tópico anterior com a próxima coluna, adicionando o título do tópico novamente. Algo como:
Topic A    Topic A    Topic B
 - A-1      - A-5      - B-4
 - A-2     Topic B     - B-5
 - A-3      - B-1      - B-6
 - A-4      - B-2
            - B-3

Para conseguir isso, você precisa processar seus dados de maneira um pouco diferente, ou seja, por contagem de itens (notícias).

Digamos que você conseguiu recuperar os dados agrupados (e, portanto, classificados) do seu banco de dados:
SELECT TopicName, NewsID FROM news GROUP BY 1;

Você pode então apenas iterar sobre todas as linhas retornadas e criar suas colunas, finalmente produzi-las (já resolvidas):
$itemsPerColumn = 4;

// get columns
$topics = array();
$items = 0;
$lastTopic = NULL;

foreach ($rows as $row)
{
    if ($lastTopic != $row['TopicName'])
    {
        $topic = array('title' => $row['TopicName']);
        $topics[] = &$topic;
    }
    $topic['entries'][] = $row;

    $items++;
    if ($items === $itemsPerColumn)
    {
        $columns[] = $topics;
        $topics = array();
        $lastTopic = NULL;
    }
}

// output
foreach($columns as $column)
{
    render_column($column);
}

Portanto, isso é realmente comparável à resposta anterior, mas desta vez você não precisa reorganizar a matriz para obter as notícias ordenadas por seu tópico porque a consulta do banco de dados já faz isso (você também pode fazer isso para a resposta anterior ).

Então, novamente, é o mesmo:iteração sobre o conjunto de resultados retornado e trazendo os dados para uma estrutura que você pode produzir. Entrada, Processamento, Saída. É sempre o mesmo.

Espero que isso seja útil.