sql >> Databasteknik >  >> RDS >> Mysql

PHP - Kapslad lista uppdelad i jämna kolumner (fix och uppdateringar)

Du har inte visat i dina båda frågor vad databastabellen är, så jag kan inte svara specifikt på den, men kommer att beskriva mitt förslag.

Du kan använda dig av aggregeringsfunktioner i mysql för att få dina nyhetsinlägg ordnade och grupperade efter ämnen inkl. deras räkning. Du kan göra två frågor för att få räkningar först, det beror lite på hur du vill hantera din data.

Använd i alla fall mysql_... funktioner kommer all data du valt från databasen att finnas i minnet (även två gånger på grund av interna funktioner). Så att ha en annan array som i din tidigare fråga borde inte skada mycket tack vare copy on write optimering i PHP. Endast en liten overhead effektivt.

Utöver det innan du tar hand om själva utmatningen bör du få ordning på dina data så att du inte behöver blanda datahantering och utdatalogik. Att blanda gör saker mer komplicerade och därför svårare att lösa. Om du till exempel lägger dina utdata i enkla funktioner blir detta enklare:

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

Detta löser redan ditt utdataproblem, så vi behöver inte bry oss om det längre. Vi behöver bara bry oss om vad vi ska mata in i dessa funktioner som parametrar.

X ämnen per kolumnvariant:

Med denna variant bör data vara en array med ett ämne per värde, som du gjorde med föregående fråga. Jag skulle säga att det redan är löst. Vet inte vilket konkret problem du har med antalet kolumner, kalkylen ser bra ut så det skippar jag tills du ger konkret information om det. "Fungerar inte" kvalificerar inte.

X-nyheterna per kolumnvariant:

Det här är mer intressant. Ett enkelt drag här är att fortsätta föregående ämne med nästa kolumn genom att lägga till ämnestiteln igen. Något i stil med:

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

För att uppnå detta måste du bearbeta dina uppgifter lite annorlunda, nämligen efter antal poster (nyheter).

Låt oss säga att du lyckades hämta data grupperade (och därför sorterade) från din databas:

SELECT TopicName, NewsID FROM news GROUP BY 1;

Du kan sedan bara iterera över alla returnerade rader och skapa dina kolumner, slutligen mata ut dem (redan löst):

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

Så detta är faktiskt jämförbart med det tidigare svaret, men den här gången behöver du inte ordna om arrayen för att få nyheterna sorterade efter deras ämne eftersom databasfrågan redan gör detta (du kan göra det för det tidigare svaret också ).

Återigen är det samma:Iteration över den returnerade resultatuppsättningen och föra data till en struktur som du kan mata ut. Ingång, bearbetning, utgång. Det är alltid samma sak.

Hoppas detta är till hjälp.




  1. Väljer alla poster från ett år sedan till nu

  2. migrera data från MS SQL till PostgreSQL?

  3. Ordna kolumnerna i MySql-tabellen med Python

  4. hur man sorterar varchar numeriska kolumner efter DESC eller ASC?