sql >> Database >  >> RDS >> Mysql

PHP - Geneste lijst opgedeeld in even kolommen (reparatie en updates)

U heeft in uw beide vragen niet getoond wat de databasetabel is, dus ik kan deze niet specifiek beantwoorden, maar zal mijn suggestie schetsen.

U kunt gebruik maken van aggregatiefuncties in mysql om uw nieuwsberichten geordend en gegroepeerd op onderwerp incl. hun telling. U kunt eerst twee zoekopdrachten uitvoeren om tellingen te krijgen, dat hangt een beetje af van hoe u met uw gegevens wilt omgaan.

Gebruik in ieder geval de mysql_... functies, zullen alle gegevens die u uit de database hebt geselecteerd in het geheugen staan ​​(zelfs twee keer vanwege internals). Dus het hebben van een andere array zoals in je vorige vraag zou niet veel pijn moeten doen dankzij kopieer-on-schrijfoptimalisatie in PHP. Slechts een kleine overhead effectief.

Daarnaast moet u, voordat u voor de daadwerkelijke uitvoer zorgt, uw gegevens op orde hebben, zodat u gegevensverwerking en uitvoerlogica niet hoeft te mixen. Mixen maakt dingen ingewikkelder en dus moeilijker op te lossen. Als u uw uitvoer bijvoorbeeld in eenvoudige functies zet, wordt dit eenvoudiger:

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

Dit lost uw uitvoerprobleem al op, dus we hebben er geen omkijken meer naar. We hoeven alleen maar te bedenken wat we als parameters in deze functies moeten invoeren.

De X-onderwerpen per kolomvariant:

Bij deze variant moeten de gegevens een array zijn met één onderwerp per waarde, zoals je deed bij de vorige vraag. Ik zou zeggen het is al opgelost. Weet niet welk concreet probleem je hebt met het aantal kolommen, de berekening ziet er goed uit, dus dat sla ik over totdat je er concrete informatie over geeft. "Werkt niet" komt niet in aanmerking.

De X nieuwsberichten per kolomvariant:

Dit is interessanter. Een gemakkelijke zet hier is om het vorige onderwerp met de volgende kolom voort te zetten door de onderwerptitel opnieuw toe te voegen. Iets als:

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

Om dit te bereiken, moet u uw gegevens iets anders verwerken, namelijk per item (nieuws) aantal.

Laten we zeggen dat het u is gelukt om de gegevens gegroepeerd (en dus gesorteerd) uit uw database te halen:

SELECT TopicName, NewsID FROM news GROUP BY 1;

U kunt dan gewoon alle geretourneerde rijen doorlopen en uw kolommen maken, en ze uiteindelijk uitvoeren (reeds opgelost):

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

Dit is dus eigenlijk vergelijkbaar met het vorige antwoord, maar deze keer hoeft u de array niet opnieuw te rangschikken om het nieuws te verkrijgen, gesorteerd op hun onderwerp, omdat de databasequery dit al doet (u zou dat ook kunnen doen voor het vorige antwoord ).

Aan de andere kant is het hetzelfde:iteratie over de geretourneerde resultatenset en de gegevens in een structuur brengen die u kunt uitvoeren. Invoer, verwerking, uitvoer. Het is altijd hetzelfde.

Ik hoop dat dit nuttig is.




  1. elimineer dubbele matrixwaarden in postgre

  2. Hoe MAKETIME() werkt in MariaDB

  3. Databasetijdzone instellen voor een AWS RDS-instantie

  4. hoe tns-vermeldingen te gebruiken met macromedia-stuurprogramma's voor Oracle