Mysql
 sql >> Database >  >> RDS >> Mysql

PHP - Elenco annidato suddiviso in colonne pari (correzioni e aggiornamenti)

In entrambe le domande non hai mostrato quale sia la tabella del database, quindi non posso rispondere in modo specifico, ma delineerò il mio suggerimento.

Puoi utilizzare le funzioni di aggregazione in mysql per ottenere le tue notizie ordinate e raggruppate per argomenti incl. il loro conteggio. Puoi prima fare due query per ottenere i conteggi, questo dipende un po' da come vorresti gestire i tuoi dati.

In ogni caso, utilizzando mysql_... funzioni, tutti i dati selezionati dal database saranno in memoria (anche due volte a causa di interni). Quindi avere un altro array come nella tua domanda precedente non dovrebbe ferire molto grazie all'ottimizzazione della copia in scrittura in PHP. Solo un piccolo sovraccarico efficace.

Oltre a ciò, prima di occuparti dell'output effettivo, dovresti mettere in ordine i tuoi dati in modo da non dover combinare la gestione dei dati e la logica di output. Il missaggio rende le cose più complicate, quindi più difficili da risolvere. Ad esempio, se metti il ​​tuo output in funzioni semplici, questo diventa più facile:

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>';
}

Questo risolve già il tuo problema di output, quindi non dobbiamo più preoccuparcene. Dobbiamo solo preoccuparci di cosa inserire in queste funzioni come parametri.

La variante X argomenti per colonna:

Con questa variante i dati dovrebbero essere un array con un argomento per valore, come hai fatto con la domanda precedente. direi che è già risolto Non so quale problema concreto hai con il numero di colonne, il calcolo sembra buono, quindi lo salterò finché non fornirai informazioni concrete a riguardo. "Non funziona" non è idoneo.

Le X notizie per variante di colonna:

Questo è più interessante. Una mossa facile qui è continuare l'argomento precedente con la colonna successiva aggiungendo di nuovo il titolo dell'argomento. Qualcosa come:

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

Per raggiungere questo obiettivo è necessario elaborare i dati in modo leggermente diverso, in particolare in base al conteggio delle voci (notizie).

Diciamo che sei riuscito a recuperare i dati raggruppati (e quindi ordinati) dal tuo database:

SELECT TopicName, NewsID FROM news GROUP BY 1;

Puoi quindi scorrere tutte le righe restituite e creare le tue colonne, infine emetterle (già risolte):

$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);
}

Quindi questo è in realtà paragonabile alla risposta precedente, ma questa volta non è necessario riorganizzare l'array per ottenere le notizie ordinate in base al loro argomento perché la query del database lo fa già (potresti farlo anche per la risposta precedente ).

Poi di nuovo è lo stesso:iterazione sul set di risultati restituito e portare i dati in una struttura che puoi generare. Input, elaborazione, output. È sempre lo stesso.

Spero che questo sia utile.