Не сте показали и в двата си въпроса какво представлява таблицата на базата данни, така че не мога конкретно да й отговоря, но ще очертая предложението си.
Можете да използвате функциите за агрегиране в mysql, за да получите вашите новини, подредени и групирани по теми, вкл. техния брой. Можете да направите две заявки, за да получите първо броя, това зависи донякъде как искате да работите с данните си.
Във всеки случай, с помощта на mysql_...
функции, всички данни, които сте избрали от базата данни, ще бъдат в паметта (дори два пъти поради вътрешни). Така че наличието на друг масив, както в предишния ви въпрос, не би трябвало да навреди много, благодарение на копирането при оптимизация на запис в PHP. Ефективно само малко режийни разходи.
Освен това, преди да се погрижите за действителния изход, трябва да подредите данните си, така че да не е необходимо да смесвате обработката на данни и изходната логика. Смесването прави нещата по-сложни и следователно по-трудни за решаване. Например, ако поставите изхода си в прости функции, това става по-лесно:
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>';
}
Това вече решава проблема ви с изхода, така че няма нужда да се интересуваме повече от него. Просто трябва да се грижим какво да зададем на тези функции като параметри.
X теми за вариант на колона:
При този вариант данните трябва да са масив с една тема на стойност, както направихте с предишния въпрос. Бих казал, че вече е решено. Не знам кой конкретен проблем имате с броя на колоните, изчислението изглежда добре, така че го пропускам, докато не предоставите конкретна информация за него. „Не работи“ не отговаря на условията.
X новинарски елементи за вариант на колона:
Това е по-интересно. Лесен ход тук е да продължите предишната тема със следващата колона, като добавите отново заглавието на темата. Нещо като:
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
За да постигнете това, трябва да обработвате данните си малко по-различно, а именно по брой елементи (новини).
Да приемем, че сте успели да извлечете данните, групирани (и следователно сортирани) от вашата база данни:
SELECT TopicName, NewsID FROM news GROUP BY 1;
След това можете просто да повторите всички върнати редове и да създадете своите колони, накрая да ги изведете (вече решено):
$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);
}
Така че това всъщност е сравнимо с предишния отговор, но този път не е необходимо да пренареждате масива, за да получите новините, подредени по тяхната тема, защото заявката за база данни вече прави това (можете да направите това и за предишния отговор ).
След това отново е същото:Итерация върху върнатия набор от резултати и привеждане на данните в структура, която можете да изведете. Вход, обработка, изход. Винаги е едно и също.
Надявам се това да е полезно.