sql >> Database teknologi >  >> RDS >> Mysql

PHP - Simple Nested Unordered List (UL) Array

Dette burde gøre tricket:

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

Jeg tror, ​​dit virkelige problem er, at du åbnede to lister hver gang, men kun lukkede én (selv flyttede den sidste blok inde i listen).

Til anden del af dit (nye) spørgsmål:

Jeg vil tage forbehold for, at for større lister (f.eks. mere end 300 elementer) ville den afvejning, jeg laver med hensyn til at gemme listen i hukommelsen og gentage to gange i stedet for blot at forespørge efter det nødvendige antal, svinge den anden vej. Det vil sige, at løsningen nedenfor lægger alt i hukommelsen, og gentager derefter en anden gang for at udskrive det; et alternativ ville være at køre to forespørgsler, en for at finde antallet af unikke emnenavne og en for at finde antallet af samlede elementer på listen.

Også for visning, vil du virkelig løse nogle optimering til layout, jeg vil gøre dette naivt og bare lave et (nogenlunde) lige antal emner pr. kolonne, og når opdelingen ikke fungerer, vil dette vægte mod venstre. Du vil se, hvor du kan justere eller erstatte noget kode for at få andre (og bedre?) resultater.

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



  1. Multi-sprog indekser med Laravel Scout og Algolia

  2. Sådan får du maks. og min. værdier fra en tabel ved hjælp af aggregeret funktion - SQL Server / TSQL vejledning del 129

  3. SQL for at finde det første ikke-numeriske tegn i en streng

  4. MySQL Group Efter brugerdefineret tidsstempel