2017-10-19 25 views
0

PHPを使用して書式設定されたHTMLタイムテーブルを表示しようとしています。PHPデータの多次元配列をHTMLテーブルに変換するには?

多次元配列のデータをHTMLテーブルに出力したい場合は、合計8つのカラム(各日のカラムMon-Sunと各セッションの開始時間を示す左側のカラム)。 行の量は、毎日のセッションの数によって異なります。

私のソリューションはある程度機能しており、次の画像で出力を確認できますが、何らかの理由で余分な行が生成されていることがわかります。 1日のセッションの量に関係なく、常に1行だけ追加行です。 Current Solution

データは次のように表される:あなたが見ることができるように

Array 
(
[0] => Array 
    (
     [0] => Array 
      (
       [id] => 1 
       [name] => A Monday Session 
       [start_time] => 10:00 
      ) 

     [1] => Array 
      (
       [id] => 5 
       [name] => Another Monday Session 
       [start_time] => 11:00 
      ) 

     [2] => Array 
      (
       [id] => 6 
       [name] => Yet Another Monday Session 
       [start_time] => 12:00 
      ) 

    ) 

[1] => Array 
    (
     [0] => Array 
      (
      ) 

    ) 

[2] => Array 
    (
     [0] => Array 
      (
       [id] => 8 
       [name] => A Wednesday Session 
       [start_time] => 14:30 
      ) 

    ) 

[3] => Array 
    (
     [0] => Array 
      (
       [id] => 3 
       [name] => A Thursday Session 
       [start_time] => 09:00 
      ) 

    ) 

[4] => Array 
    (
     [0] => Array 
      (
      ) 

    ) 

[5] => Array 
    (
     [0] => Array 
      (
      ) 

    ) 

[6] => Array 
    (
     [0] => Array 
      (
       [id] => 4 
       [name] => A Sunday Session 
       [start_time] => 13:00 
      ) 

    ) 

) 

はメインキーは曜日を表します。 0 =月曜日、1 =火曜日など 毎日セッションのリストがあります。この例では、月曜日に3つのセッションがあり、水、木、サンにはそれぞれ1つのセッションがあります。

これらはすべて開始時刻が異なることに注意してください。重複した開始時刻を持つセッションにデータが導入されると、同じ行を共有するのではなく、追加の行も作成されます。木曜日のセッションを月曜日と同じにするために10:00に変更した出力を参照してください。 Buggy Output

そしてここに私のバギーの解決策があります。私は、私が間違っている行のコメントをマークしました。

// $sessionRows is the array of arrays containing the data above. 

    // Grabs array of session times from $sessionRows that has been sorted and duplicates removed. 
    // Current values: Array ([0] => 09:00 [1] => 10:00 [2] => 11:00 [3] => 12:00 [4] => 13:00 [5] => 14:30) 
    $sessionTimes = $this->getSessionTimes($days); 

    $numOfRows = count($sessionTimes); 
    $numOfCols = $dayIdx; 

    // Create grid with correct dimensions and rows represented by the session times 
    $grid = array(); 
    for($i=0;$i<count($sessionTimes);$i++) { 
     $row = array(); 
     for($j=0;$j<$numOfCols;$j++) { 
      $row[] = '<td></td>'; 
     } 
     $grid[$sessionTimes[$i]] = $row; 
    } 


    // Populate grid with session info added to correct coordinates. 
    for($i=0;$i<$numOfCols;$i++) { 
     echo count($sessionRows[$i]); 
     for($j=0;$j<count($sessionRows);$j++) { 
      $grid[$sessionRows[$i][$j]['start_time']][$i] = $sessionRows[$i][$j]; 
     } 
    } 

    $rows=''; 
    $idx = 0; 
    foreach($grid as $rowArray) { 
     $rows .= '<tr>'; 
     /*** This lines is the problem! It adds the session time as the first column. ***/ 
     $rows .= '<td class="time-col">'.$sessionTimes[$idx].'</td>'; 
     for($i=0;$i<count($rowArray);$i++) { 
      if(!empty($rowArray[$i]['name'])){ 
       $rows .= '<td>'.$rowArray[$i]['name'].'<br>'.$rowArray[$i]['start_time'].'</td>'; 
      } else { 
       $rows .= '<td> - </td>'; 
      } 
     } 
     $rows .= '</tr>'; 
     $idx++; 
    } 

return $rows; 
+0

セッションの曜日をどのように知っていますか? – Misunderstood

+0

ちょうど配列が配列されているためです。 0 =月曜日、1 =火曜日など – Muzzstick

答えて

0

問題は、$ sessionTimes配列がarray_unique()関数を使用して重複を削除していたことでした。

この関数は、削除された値のインデックスを保持していました。したがって、追加の行は値なしで作成されていました。

これをarray_values(array_unique($ array))に変更すると、再生成されたキーが許可され、問題が修正されました。

これを見る人のおかげで、私はこれを早く実現したいと考えています!

0

ここでは、より少ないループを使用する代替ソリューションです。

時間をループして毎日ループして、セッションstart_timeが一致するかどうかを確認し、一致する場合は出力テーブルに追加します。

<?php 

$sessionTimes = ['09:00', '10:00', '11:00', '12:00', '13:00', '14:30']; 

$schedule = [ 
    [ 
     [ 
      'id' => 1, 
      'name' => 'A Monday Session', 
      'start_time' => '10:00' 

     ], 
     [ 
      'id' => 5, 
      'name' => 'Another Monday Session', 
      'start_time' => '11:00' 

     ], 
     [ 
      'id' => 6, 
      'name' => 'Yet Another Monday Session', 
      'start_time' => '12:00' 

     ], 
    ], 
    [ 
     []  
    ], 
    [ 
     [ 
      'id' => 8, 
      'name' => 'A Wednesday Session', 
      'start_time' => '14:30' 
     ]  
    ], 
    [ 
     [ 
      'id' => 3, 
      'name' => 'A Thursday Session', 
      'start_time' => '09:00' 
     ]  
    ], 
    [ 
     [] 
    ], 
    [ 
     [] 
    ], 
    [ 
     [ 
      'id' => 4, 
      'name' => 'A Sunday Session', 
      'start_time' => '13:00' 
     ] 
    ] 
]; 

$output = '<table><thead><tr><th></th><th>Monday</th><th>Tuesday</th><th>Wednesday</th><th>Thursday</th><th>Friday</th><th>Saturday</th><th>Sunday</th></thead><tbody>'; 

foreach ($sessionTimes as $sessionTime) { 
    $output .= '<tr><td>'.$sessionTime.'</td>'; 

    $day = 0; 
    for ($i = 0; $i < count($schedule); $i++) { 
     if ($i == $day) { 
      $sessionAtTime = '<td>-</td>'; 
      foreach ($schedule[$day] as $session) { 
       if (!empty($session) && $session['start_time'] == $sessionTime) { 
        $sessionAtTime = '<td><b>' . $session['name'] . '</b><br>Start: ' . $sessionTime.'</td>'; 
       } 
      } 
      $output .= $sessionAtTime; 
      $day++; 
     } 
    } 

    $output .= '</tr>'; 
} 

$output .= '</tbody></table>'; 

echo $output;