Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP - Liste imbriquée divisée en colonnes paires (correction et mises à jour)

Vous n'avez pas montré dans vos deux questions ce qu'est la table de la base de données, je ne peux donc pas y répondre spécifiquement, mais je vais exposer ma suggestion.

Vous pouvez utiliser les fonctions d'agrégation de mysql pour obtenir vos entrées d'actualités classées et regroupées par sujets incl. leur compte. Vous pouvez d'abord effectuer deux requêtes pour obtenir les nombres, cela dépend un peu de la façon dont vous souhaitez traiter vos données.

Dans tous les cas, en utilisant le mysql_... fonctions, toutes les données que vous avez sélectionnées dans la base de données seront en mémoire (même deux fois en raison d'internes). Donc, avoir un autre tableau comme dans votre question précédente ne devrait pas faire beaucoup de mal grâce à l'optimisation de la copie sur écriture en PHP. Seulement une petite surcharge efficace.

À côté de cela, avant de vous occuper de la sortie réelle, vous devez mettre vos données en ordre afin de ne pas avoir à mélanger la gestion des données et la logique de sortie. Le mélange rend les choses plus compliquées et donc plus difficiles à résoudre. Par exemple, si vous placez votre sortie dans des fonctions simples, cela devient plus facile :

function render_list($title, array $entries)
{
    echo '<ul><li>', $title, '<ul>';
    foreach($entries as $entry)
    {
        echo '<li>', $entry['NewsID'], '</li>';
    }
    echo '</ul></li></ul>;
}

function render_column(array $topics)
{
    echo '<div class="column">';
    foreach($topics as $topic)
    {
        render_list($topic['title'], $topic['entries']);
    }
    echo '</div>';
}

Cela résout déjà votre problème de sortie, nous n'avons donc plus besoin de nous en soucier. Nous devons juste nous soucier de ce qu'il faut intégrer à ces fonctions en tant que paramètres.

Les sujets X par variante de colonne :

Avec cette variante, les données doivent être un tableau avec un sujet par valeur, comme vous l'avez fait avec la question précédente. Je dirais que c'est déjà résolu. Je ne sais pas quel problème concret vous avez avec le nombre de colonnes, le calcul semble bon, donc je saute cela jusqu'à ce que vous fournissiez des informations concrètes à ce sujet. "Ne fonctionne pas" n'est pas admissible.

Les X actualités par variante de colonne :

C'est plus intéressant. Une étape facile ici consiste à continuer le sujet précédent avec la colonne suivante en ajoutant à nouveau le titre du sujet. Quelque chose comme :

Topic A    Topic A    Topic B
 - A-1      - A-5      - B-4
 - A-2     Topic B     - B-5
 - A-3      - B-1      - B-6
 - A-4      - B-2
            - B-3

Pour y parvenir, vous devez traiter vos données un peu différemment, à savoir par nombre d'articles (actualités).

Admettons que vous ayez réussi à récupérer les données groupées (et donc triées) de votre base de données :

SELECT TopicName, NewsID FROM news GROUP BY 1;

Vous pouvez ensuite simplement itérer sur toutes les lignes renvoyées et créer vos colonnes, puis les afficher (déjà résolu) :

$itemsPerColumn = 4;

// get columns
$topics = array();
$items = 0;
$lastTopic = NULL;

foreach ($rows as $row)
{
    if ($lastTopic != $row['TopicName'])
    {
        $topic = array('title' => $row['TopicName']);
        $topics[] = &$topic;
    }
    $topic['entries'][] = $row;

    $items++;
    if ($items === $itemsPerColumn)
    {
        $columns[] = $topics;
        $topics = array();
        $lastTopic = NULL;
    }
}

// output
foreach($columns as $column)
{
    render_column($column);
}

C'est donc en fait comparable à la réponse précédente, mais cette fois, vous n'avez pas besoin de réorganiser le tableau pour obtenir les nouvelles classées par leur sujet car la requête de base de données le fait déjà (vous pouvez également le faire pour la réponse précédente ).

Là encore, c'est la même chose :itération sur l'ensemble de résultats renvoyé et intégration des données dans une structure que vous pouvez générer. Entrée, Traitement, Sortie. C'est toujours pareil.

J'espère que cela vous sera utile.