यह चाल चलनी चाहिए:
$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>';
मुझे लगता है कि आपकी वास्तविक समस्या यह है कि आप हर बार दो सूचियां खोल रहे थे, लेकिन केवल एक को बंद कर रहे थे (यहां तक कि सूची के अंदर अंतिम ब्लॉक को भी ले जा रहे थे)।
आपके (नए) प्रश्न के दूसरे भाग के लिए:
मैं चेतावनी दूंगा कि बड़ी सूचियों (जैसे, 300 से अधिक आइटम) के लिए मैं जिस ट्रेडऑफ़ को स्मृति में सूची को संग्रहीत करने के संबंध में बना रहा हूं और केवल आवश्यक गणनाओं के लिए पूछताछ करने के बजाय दो बार पुनरावृत्ति कर रहा हूं, दूसरी तरफ स्विंग होगा। यही है, नीचे दिया गया समाधान सब कुछ स्मृति में रखता है, फिर इसे प्रिंट करने के लिए दूसरी बार पुनरावृत्त करता है; एक विकल्प दो प्रश्नों को चलाने के लिए होगा, एक अद्वितीय विषय नामों की संख्या का पता लगाने के लिए और दूसरा सूची में कुल आइटमों की संख्या को खोजने के लिए।
इसके अलावा, प्रदर्शन के लिए, आप वास्तव में लेआउट के लिए कुछ अनुकूलन को हल करना चाहते हैं, मैं इसे भोलेपन से करूंगा और प्रति कॉलम (लगभग) समान संख्या में विषय बनाऊंगा और जब विभाजन काम नहीं करेगा तो यह बाईं ओर वजन करेगा। आप देखेंगे कि आप भिन्न (और बेहतर?) परिणाम प्राप्त करने के लिए कुछ कोड को कहां बदल सकते हैं या बदल सकते हैं।
$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>';
}