Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP - Verschachtelte Liste in gerade Spalten aufgeteilt (Fixes und Updates)

Sie haben in Ihren beiden Fragen nicht gezeigt, was die Datenbanktabelle ist, daher kann ich sie nicht speziell beantworten, werde aber meinen Vorschlag skizzieren.

Sie können die Aggregationsfunktionen in mysql nutzen, um Ihre Nachrichteneinträge geordnet und nach Themen gruppiert inkl. ihre Zählung. Sie können zuerst zwei Abfragen durchführen, um die Anzahl zu erhalten, das hängt ein wenig davon ab, wie Sie mit Ihren Daten umgehen möchten.

Verwenden Sie in jedem Fall den mysql_... Funktionen sind alle Daten, die Sie aus der Datenbank ausgewählt haben, im Speicher (internal sogar doppelt). Ein anderes Array wie in Ihrer vorherigen Frage sollte also nicht viel schaden, dank der Copy-on-Write-Optimierung in PHP. Effektiv nur ein kleiner Overhead.

Bevor Sie sich um die eigentliche Ausgabe kümmern, sollten Sie außerdem Ihre Daten in Ordnung bringen, damit Sie die Datenverarbeitung und die Ausgabelogik nicht mischen müssen. Das Mischen macht die Dinge komplizierter und daher schwieriger zu lösen. Wenn Sie beispielsweise Ihre Ausgabe in einfache Funktionen packen, wird dies einfacher:

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

Damit ist Ihr Ausgabeproblem bereits gelöst, sodass wir uns nicht mehr darum kümmern müssen. Wir müssen uns nur darum kümmern, was wir als Parameter in diese Funktionen eingeben.

Die X Themen pro Spaltenvariante:

Bei dieser Variante sollten die Daten ein Array mit einem Thema pro Wert sein, wie Sie es bei der vorherigen Frage getan haben. Ich würde sagen, es ist bereits gelöst. Weiß nicht welches konkrete Problem du mit der Anzahl der Spalten hast, die Berechnung sieht gut aus, daher überspringe ich das bis du konkrete Angaben dazu machst. "Funktioniert nicht" qualifiziert nicht.

Die X Nachrichten pro Spaltenvariante:

Das ist interessanter. Ein einfacher Schritt hier ist, das vorherige Thema mit der nächsten Spalte fortzusetzen, indem Sie den Thementitel erneut hinzufügen. Etwas wie:

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

Um dies zu erreichen, müssen Sie Ihre Daten etwas anders verarbeiten, nämlich nach Artikel (Nachrichten) zählen.

Angenommen, Sie haben es geschafft, die Daten gruppiert (und daher sortiert) aus Ihrer Datenbank abzurufen:

SELECT TopicName, NewsID FROM news GROUP BY 1;

Sie können dann einfach über alle zurückgegebenen Zeilen iterieren und Ihre Spalten erstellen und schließlich ausgeben (bereits gelöst):

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

Das ist also tatsächlich vergleichbar mit der vorherigen Antwort, aber dieses Mal müssen Sie das Array nicht neu anordnen, um die nach ihrem Thema geordneten Nachrichten zu erhalten, da die Datenbankabfrage dies bereits tut (das könnten Sie auch für die vorherige Antwort tun ).

Dann ist es wieder dasselbe:Iteration über die zurückgegebene Ergebnismenge und das Bringen der Daten in eine Struktur, die Sie ausgeben können. Eingabe, Verarbeitung, Ausgabe. Es ist immer dasselbe.

Hoffe, das ist hilfreich.