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

テーブルの行をPHP配列とマージする方法は?

    ネストされたループを処理するために「先読み」手法を使用します。これは、現在のレコードが処理されるとすぐに次のレコードを読み取る必要があるため、「foreach」ループを使用できないことを意味します。基本的に、ループで行う最後のアクションは、次の反復のために設定するときに次のレコードを読み取ることです。グループの構造によって決定されるため、レコードをいつ印刷するかをテストすることはありません。コードループは、データ内のグループの構造と同じです

    「グループ」はすべてです 同じidのレコード 。

    'content'と'act'は、グループ内の各エントリで同一であると想定しています。

    'rowspan'属性を適切な'td'タグに追加するように編集されました。この時点でcssの方が簡単かもしれないと思います。

    問題は、グループに含まれるエントリの数がわかるまで、グループを表示できないことです。

    したがって、配列内のグループに属するすべてのレコードを「バッファリング」します。グループの最後には、htmlに適切な「rowspan」属性が表示されます。

    PHP5.3.18でテストされています。テストデータが含まれています。

    <?php /* Q24028866 */
    $testData = array(array('id' => 2, 'date' => '05/13/2014', 'content' => 'some contents 2', 'act' => 'act1 act2 act3'),
                      array('id' => 2, 'date' => '05/28/2014', 'content' => 'some contents 2',  'act' => 'act1 act2 act3'),
                      array('id' => 7, 'date' => '06/04/2014', 'content' => 'some contents 7',  'act' => 'act1 act2 act3'),
                      array('id' => 8, 'date' => '06/08/2014', 'content' => 'some contents 8',  'act' => 'act1 act2 act3'),
                      array('id' => 8, 'date' => '06/09/2014', 'content' => 'some contents 8',  'act' => 'act1 act2 act3'));
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    <table border='1'>
    <thead><th>Date</th><th>Content</th><th>Act</th></thead>
    <?php
    // use 'read ahead' so there is always a 'previous' record to compare against...
    $iterContents = new \ArrayIterator($testData);
    $curEntry = $iterContents->current();
    
    while ($iterContents->valid()) { // there are entries to process
    
        $curId = $curEntry['id'];
    
        // buffer the group to find out how many entries it has...
        $buffer = array();
        $buffer[] = $curEntry;
    
        $iterContents->next(); // next entry - may be same or different id...
        $curEntry = $iterContents->current();
    
        while ($iterContents->valid() && $curEntry['id'] == $curId) {  // process the group...
            $buffer[] = $curEntry; // store all records for a group in the buffer
    
            $iterContents->next(); // next entry - may be same or different id...
            $curEntry = $iterContents->current();
        }
    
         // display the current group in the buffer...
         echo '<tr>';
         echo '<td>', $buffer[0]['date'], '</td>';
         $rowspan = count($buffer) > 1 ? ' rowspan="'. count($buffer) .'"' : '';
         echo '<td', $rowspan, '>', $buffer[0]['content'], '</td>',
               '<td', $rowspan, '>', $buffer[0]['act'], '</td>';
         echo '</tr>';
         for($i = 1; $i < count($buffer); $i++) {
              echo '<tr><td>', $buffer[$i]['date'], '</td>';
              echo '</tr>';
         }
    } ?>
    </table>
    </body>
    </html>
    


    1. 制約の名前を知らずに外部キーを削除しますか?

    2. 動的な.htaccessファイルを作成できますか?

    3. WHERE句でmysqlSUM()を使用する

    4. Mysqlは、結果がない場合でも毎日表示されます