V obou otázkách jste neuvedli, co je databázová tabulka, takže na ni nemohu konkrétně odpovědět, ale nastíním svůj návrh.
Můžete použít agregační funkce v mysql k získání vašich příspěvků seřazených a seskupených podle témat vč. jejich počet. Nejprve můžete provést dva dotazy, abyste získali počty, to trochu závisí na tom, jak chcete s daty nakládat.
V každém případě pomocí mysql_...
funkcí, všechna vámi vybraná data z databáze budou v paměti (kvůli vnitřnostem dokonce dvakrát). Takže mít další pole jako ve vaší předchozí otázce by nemělo moc bolet díky kopírování optimalizace zápisu v PHP. Efektivně jen malá režie.
Kromě toho, než se postaráte o skutečný výstup, měli byste si dát svá data do pořádku, abyste nemuseli míchat zpracování dat a logiku výstupu. Míchání dělá věci složitější, a proto je těžší je vyřešit. Pokud například vložíte svůj výstup do jednoduchých funkcí, bude to jednodušší:
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>';
}
To již řeší váš problém s výstupem, takže se o to již nemusíme starat. Musíme se jen starat o to, co vložíme do těchto funkcí jako parametry.
X témat na variantu sloupce:
U této varianty by data měla být pole s jedním tématem na hodnotu, jako jste to udělali u předchozí otázky. Řekl bych, že už je to vyřešené. Nevím, jaký konkrétní problém máte s počtem sloupců, výpočet vypadá dobře, takže to přeskakuji, dokud o tom neuvedete konkrétní informace. "Nefunguje" nesplňuje podmínky.
X zpráv na variantu sloupce:
Tohle je zajímavější. Zde je snadným krokem pokračovat v předchozím tématu dalším sloupcem opětovným přidáním názvu tématu. Něco jako:
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
Abyste toho dosáhli, musíte svá data zpracovávat trochu jinak, konkrétně podle počtu položek (novinek).
Řekněme, že se vám podařilo získat seskupená (a tedy seřazená) data z vaší databáze:
SELECT TopicName, NewsID FROM news GROUP BY 1;
Poté můžete pouze iterovat všechny vrácené řádky a vytvořit své sloupce a nakonec je vytisknout (již vyřešeno):
$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);
}
Takže to je ve skutečnosti srovnatelné s předchozí odpovědí, ale tentokrát nemusíte znovu uspořádat pole, abyste získali zprávy uspořádané podle jejich tématu, protože to již dělá databázový dotaz (můžete to udělat i pro předchozí odpověď ).
Pak je to opět stejné:Iterace přes vrácenou sadu výsledků a přenesení dat do struktury, kterou můžete vytisknout. Vstup, zpracování, výstup. Vždy je to stejné.
Doufám, že vám to pomůže.