No ha mostrado en sus dos preguntas cuál es la tabla de la base de datos, por lo que no puedo responderla específicamente, pero describiré mi sugerencia.
Puede hacer uso de las funciones de agregación en mysql para obtener sus entradas de noticias ordenadas y agrupadas por temas, incl. su cuenta. Puede hacer dos consultas para obtener recuentos primero, eso depende un poco de cómo le gustaría tratar sus datos.
En cualquier caso, usando mysql_...
funciones, todos los datos que seleccionó de la base de datos estarán en la memoria (incluso dos veces debido a las funciones internas). Entonces, tener otra matriz como en su pregunta anterior no debería doler mucho gracias a la copia en la optimización de escritura en PHP. Solo una pequeña sobrecarga de manera efectiva.
Además de eso, antes de encargarse de la salida real, debe ordenar sus datos para que no necesite mezclar el manejo de datos y la lógica de salida. La mezcla hace que las cosas sean más complicadas y, por lo tanto, más difíciles de resolver. Por ejemplo, si pone su salida en funciones simples, esto se vuelve más fácil:
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>';
}
Esto ya resuelve su problema de salida, por lo que ya no es necesario que nos preocupemos por eso. Solo tenemos que preocuparnos por qué alimentar estas funciones como parámetros.
La variante X temas por columna:
Con esta variante, los datos deben ser una matriz con un tema por valor, como hiciste con la pregunta anterior. Diría que ya está solucionado. No sé qué problema concreto tiene con la cantidad de columnas, el cálculo se ve bien, así que lo omito hasta que proporcione información concreta al respecto. "No funciona" no califica.
Las X noticias por variante de columna:
Esto es más interesante. Un movimiento fácil aquí es continuar el tema anterior con la siguiente columna agregando el título del tema nuevamente. Algo como:
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
Para lograr esto, debe procesar sus datos de manera un poco diferente, es decir, por recuento de elementos (noticias).
Digamos que logró recuperar los datos agrupados (y por lo tanto ordenados) de su base de datos:
SELECT TopicName, NewsID FROM news GROUP BY 1;
Luego puede simplemente iterar sobre todas las filas devueltas y crear sus columnas, finalmente generarlas (ya resueltas):
$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);
}
Entonces, esto es en realidad comparable a la respuesta anterior, pero esta vez no necesita reorganizar la matriz para obtener las noticias ordenadas por su tema porque la consulta de la base de datos ya lo hace (también podría hacerlo para la respuesta anterior) ).
Por otra parte, es lo mismo:iteración sobre el conjunto de resultados devuelto y llevar los datos a una estructura que puede generar. Entrada, Procesamiento, Salida. Siempre es lo mismo.
Espero que esto sea útil.