sql >> データベース >  >> RDS >> Mysql

PHP-ネストされたリストが偶数列に分割されました(修正と更新)

    両方の質問でデータベーステーブルが何であるかを示していないため、具体的に答えることはできませんが、私の提案の概要を説明します。

    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);
    }
    

    したがって、これは実際には前の回答に匹敵しますが、データベースクエリがすでにこれを行っているため、今回はトピック順にニュースを取得するために配列を再配置する必要はありません(前の回答でも同様に行うことができます) 。

    それでも同じです。返された結果セットを反復処理し、出力可能な構造にデータを取り込みます。入力、処理、出力。いつも同じです。

    これがお役に立てば幸いです。




    1. SQLite-関係を作成する

    2. Node.jsおよびmysqlコールバック:クエリコールバックでのクエリ

    3. CREATE TABLE定義にインデックスを作成できますか?

    4. ファイルを調べたり、BLOBを介してSQL LIKE%x%クエリを実行したりすると、一般的に高速なものは何ですか?