Du har ikke vist i dine begge spørgsmål, hvad databasetabellen er, så jeg kan ikke specifikt svare på den, men vil skitsere mit forslag.
Du kan gøre brug af aggregeringsfunktioner i mysql for at få dine nyhedsindlæg ordnet og grupperet efter emner inkl. deres optælling. Du kan lave to forespørgsler for at få tællinger først, det afhænger lidt af, hvordan du gerne vil håndtere dine data.
Under alle omstændigheder skal du bruge mysql_...
funktioner, vil alle data, du valgte fra databasen, være i hukommelsen (selv to gange på grund af interne elementer). Så at have et andet array som i dit tidligere spørgsmål burde ikke skade meget takket være copy-on-skrive-optimering i PHP. Kun en lille overhead effektivt.
Udover det, før du tager dig af selve outputtet, bør du få styr på dine data, så du ikke behøver at blande datahåndtering og outputlogik. Blanding gør tingene mere komplicerede og derfor sværere at løse. Hvis du f.eks. sætter dit output i simple funktioner, bliver dette nemmere:
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>';
}
Dette løser allerede dit outputproblem, så vi behøver ikke bekymre os om det længere. Vi skal bare bekymre os om, hvad der skal tilføres disse funktioner som parametre.
De X emner pr. kolonnevariant:
Med denne variant bør dataene være et array med ét emne pr. værdi, ligesom du gjorde med det forrige spørgsmål. Jeg vil sige, at det allerede er løst. Ved ikke hvilket konkret problem du har med antallet af kolonner, regnestykket ser godt ud, så det springer jeg over indtil du giver konkrete oplysninger om det. "Virker ikke" kvalificerer ikke.
De X nyheder pr. kolonnevariant:
Det her er mere interessant. Et nemt træk her er at fortsætte det forrige emne med den næste kolonne ved at tilføje emnetitlen igen. Noget som:
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
For at opnå dette er du nødt til at behandle dine data lidt anderledes, nemlig efter antal vare(nyheder).
Lad os sige, at du formåede at hente dataene grupperet (og derfor sorteret) fra din database:
SELECT TopicName, NewsID FROM news GROUP BY 1;
Du kan så bare iterere over alle returnerede rækker og oprette dine kolonner, og til sidst udskrive dem (allerede 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å dette er faktisk sammenligneligt med det forrige svar, men denne gang behøver du ikke at omarrangere arrayet for at få nyhederne sorteret efter deres emne, fordi databaseforespørgslen allerede gør dette (det kunne du også gøre for det forrige svar ).
Så er det igen det samme:Gentagelse over det returnerede resultatsæt og bringe dataene ind i en struktur, som du kan udlæse. Input, behandling, output. Det er altid det samme.
Håber dette er nyttigt.