両方の質問でデータベーステーブルが何であるかを示していないため、具体的に答えることはできませんが、私の提案の概要を説明します。
mysqlの集計関数を使用して、トピックごとに順序付けおよびグループ化されたニュースエントリを取得できます。彼らの数。最初にカウントを取得するために2つのクエリを実行できますが、これはデータの処理方法によって異なります。
いずれにせよ、mysql_...
を使用します 関数、データベースから選択したすべてのデータはメモリにあります(内部のために2回でも)。したがって、前の質問のように別の配列を使用しても、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トピック:
このバリアントでは、前の質問で行ったように、データは値ごとに1つのトピックを持つ配列である必要があります。すでに解決していると思います。列数に関してどの具体的な問題があるのかわからないので、計算はうまくいくように見えるので、具体的な情報を提供するまでそれをスキップします。 「機能しない」は対象外です。
列バリアントごとの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);
}
したがって、これは実際には前の回答に匹敵しますが、データベースクエリがすでにこれを行っているため、今回はトピック順にニュースを取得するために配列を再配置する必要はありません(前の回答でも同様に行うことができます) 。
それでも同じです。返された結果セットを反復処理し、出力可能な構造にデータを取り込みます。入力、処理、出力。いつも同じです。
これがお役に立てば幸いです。