Nie pokazałeś w obu pytaniach, czym jest tabela bazy danych, więc nie mogę na to konkretnie odpowiedzieć, ale przedstawię moją sugestię.
Możesz skorzystać z funkcji agregacji w mysql, aby uzyskać wpisy uporządkowane i pogrupowane według tematów, w tym. ich liczba. Możesz wykonać dwa zapytania, aby najpierw uzyskać liczbę, która zależy trochę od tego, jak chcesz postępować z danymi.
W każdym razie, używając mysql_...
funkcje, wszystkie dane wybrane z bazy danych będą w pamięci (nawet dwukrotnie ze względu na wewnętrzne). Tak więc posiadanie innej tablicy, jak w poprzednim pytaniu, nie powinno zaszkodzić dzięki optymalizacji kopiowania przy zapisie w PHP. Tylko małe koszty ogólne.
Oprócz tego, zanim zajmiesz się faktycznymi wynikami, powinieneś uporządkować dane, aby nie trzeba było mieszać obsługi danych i logiki wyjściowej. Mieszanie sprawia, że rzeczy są bardziej skomplikowane, a tym samym trudniejsze do rozwiązania. Na przykład, jeśli umieścisz swoje dane wyjściowe w prostych funkcjach, stanie się to łatwiejsze:
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 już rozwiązuje Twój problem z wydrukiem, więc nie musimy się już tym przejmować. Musimy tylko zadbać o to, co należy wprowadzić do tych funkcji jako parametry.
Tematy X na wariant kolumny:
W tym wariancie dane powinny być tablicą z jednym tematem na wartość, tak jak w przypadku poprzedniego pytania. Powiedziałbym, że to już rozwiązane. Nie wiem, jaki konkretny problem masz z liczbą kolumn, obliczenia wyglądają dobrze, więc pomijam je, dopóki nie podasz konkretnych informacji na ten temat. „Nie działa” nie kwalifikuje się.
X wiadomości na wariant kolumny:
To jest bardziej interesujące. W tym miejscu prostym posunięciem jest kontynuowanie poprzedniego tematu w następnej kolumnie poprzez ponowne dodanie tytułu tematu. Coś takiego:
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
Aby to osiągnąć, musisz przetwarzać swoje dane nieco inaczej, a mianowicie według liczby pozycji (wiadomości).
Załóżmy, że udało Ci się pobrać dane pogrupowane (a tym samym posortowane) ze swojej bazy danych:
SELECT TopicName, NewsID FROM news GROUP BY 1;
Następnie możesz po prostu iterować po wszystkich zwróconych wierszach i tworzyć kolumny, a na koniec je wyprowadzić (już rozwiązane):
$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 więc jest to właściwie porównywalne z poprzedniąodpowiedzią, ale tym razem nie musisz ponownie układaćtablicy, aby uzyskaćwiadomości uporządkowane według ich tematu ponieważ zapytanie bazy danych już to robi (możesz to zrobić również dla poprzedniej odpowiedzi ).
Potem znowu jest to samo:iteracja po zwróconym zestawie wyników i wprowadzenie danych do struktury, którą można wyprowadzić. Wejście, przetwarzanie, wyjście. Zawsze jest tak samo.
Mam nadzieję, że to będzie pomocne.