Dit zou moeten werken:
$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>';
Ik denk dat je echte probleem is dat je elke keer twee lijsten opent, maar er slechts één sluit (zelfs het laatste blok binnen de lijst verplaatst).
Voor het tweede deel van uw (nieuwe) vraag:
Ik moet er rekening mee houden dat voor grotere lijsten (bijvoorbeeld meer dan 300 items) de afweging die ik maak met betrekking tot het opslaan van de lijst in het geheugen en twee keer herhalen in plaats van alleen maar te zoeken naar benodigde tellingen de andere kant op zou gaan. Dat wil zeggen, de onderstaande oplossing zet alles in het geheugen en herhaalt het een tweede keer om het af te drukken; een alternatief zou zijn om twee zoekopdrachten uit te voeren, één om het aantal unieke TopicNames te vinden en één om het totale aantal items in de lijst te vinden.
Ook voor weergave wil je echt wat optimalisatie voor lay-out oplossen, ik zal dit naïef doen en gewoon een (ongeveer) gelijk aantal onderwerpen per kolom maken en als de verdeling niet lukt, zal dit naar links wegen. Je zult zien waar je wat code kunt aanpassen of vervangen om andere (en betere?) resultaten te krijgen.
$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>';
}