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

PHP - Array mit einfacher verschachtelter ungeordneter Liste (UL).

Das sollte funktionieren:

$result = mysql_query("SELECT * FROM News");
$topicname = '';

// open list of topics
echo '<ul>';

// loop through topics
while($row = mysql_fetch_array($result)) {
    if (!$row['TopicID']) {
        // fake topic name for unsorted stuff
        $row['TopicName'] = 'Sort Me';
    }
    if ($topicname != $row['TopicName']) {
        if($topicname != ''){
            // had a topic name, means we opened a list
            // that hasn't been closed, close it.
            echo '</ul>';
        }
        // print this topic and open the list of articles
        echo '<li>' . $row['TopicName'] . '</li><ul>';
        // update the current topic to be this TopicName
        $topicname = $row['TopicName']; 
    }
    // the news item
    echo '<li>' . $row['NewsID'] . '"</li>';
}
if($topicname != ''){
    // we saw at least one TopicName, we need to close
    // the last open list.
    echo '</ul>';
}
// end topic list
echo '</ul>';

Ich denke, Ihr eigentliches Problem ist, dass Sie jedes Mal zwei Listen öffnen, aber nur eine schließen (sogar den letzten Block innerhalb der Liste verschieben).

Für den zweiten Teil Ihrer (neuen) Frage:

Ich möchte darauf hinweisen, dass bei größeren Listen (z. B. mehr als 300 Elementen) der Kompromiss, den ich in Bezug auf das Speichern der Liste im Speicher und das zweimalige Iterieren mache, anstatt nur die erforderlichen Zählwerte abzufragen, in die andere Richtung schwingen würde. Das heißt, die folgende Lösung legt alles in den Speicher und iteriert dann ein zweites Mal, um es auszudrucken; Eine Alternative wäre, zwei Abfragen auszuführen, eine, um die Anzahl der eindeutigen TopicNames zu finden, und eine, um die Anzahl der Gesamteinträge in der Liste zu finden.

Außerdem möchten Sie für die Anzeige wirklich einige Optimierungen für das Layout lösen. Ich werde dies naiv tun und nur eine (ungefähr) gleiche Anzahl von Themen pro Spalte erstellen, und wenn die Aufteilung nicht funktioniert, wird dies nach links gewichtet. Sie werden sehen, wo Sie Code anpassen oder ersetzen können, um andere (und bessere?) Ergebnisse zu erzielen.

$columns = // user specified;

$result = mysql_query("SELECT * FROM News");
$num_articles = 0;

// $dataset will contain array( 'Topic1' => array('News 1', 'News2'), ... )
$dataset = array();
while($row = mysql_fetch_array($result)) {
    if (!$row['TopicID']) {
        $row['TopicName'] = 'Sort Me';
    }
    $dataset[$row['TopicName']][] = $row['NewsID'];
    $num_articles++;
}

$num_topics = count($dataset);

// naive topics to column allocation
$topics_per_column = ceil($num_topics / $columns);

$i = 0; // keeps track of number of topics printed
$c = 1; // keeps track of columns printed
foreach($dataset as $topic => $items){
    if($i % $topics_per_columnn == 0){
        if($i > 0){
            echo '</ul></div>';
        }
        echo '<div class="Columns' . $columns . 'Group' . $c . '"><ul>';
        $c++;
    }
    echo '<li>' . $topic . '</li>';
    // this lists the articles under this topic
    echo '<ul>';
    foreach($items as $article){
        echo '<li>' . $article . '</li>';
    }
    echo '</ul>';
    $i++;
}
if($i > 0){
    // saw at least one topic, need to close the list.
    echo '</ul></div>';
}