Ini akan berhasil:
$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>';
Saya pikir masalah Anda yang sebenarnya adalah Anda membuka dua daftar setiap kali, tetapi hanya menutup satu (bahkan memindahkan blok terakhir di dalam daftar).
Untuk bagian kedua dari pertanyaan (baru) Anda:
Saya akan memperingatkan bahwa untuk daftar yang lebih besar (katakanlah, lebih dari 300 item) pengorbanan yang saya buat sehubungan dengan menyimpan daftar dalam memori dan mengulangi dua kali daripada hanya menanyakan jumlah yang diperlukan akan berayun ke arah lain. Yaitu, solusi di bawah ini menempatkan semuanya ke dalam memori, lalu mengulangi untuk kedua kalinya untuk mencetaknya; alternatifnya adalah menjalankan dua kueri, satu untuk menemukan jumlah TopicNames unik dan satu lagi untuk menemukan jumlah item total dalam daftar.
Juga, untuk tampilan, Anda benar-benar ingin menyelesaikan beberapa pengoptimalan untuk tata letak, saya akan melakukan ini secara naif dan hanya membuat (kira-kira) jumlah topik yang sama per kolom dan ketika pembagian tidak berhasil, ini akan berbobot ke kiri. Anda akan melihat di mana Anda dapat mengubah atau mengganti beberapa kode untuk mendapatkan hasil yang berbeda (dan lebih baik?).
$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>';
}