2017-10-19 4 views
0

Ich versuche, einen formatierten HTML-Stundenplan mit PHP anzuzeigen.Wie konvertiert man mehrdimensionale PHP-Daten in eine HTML-Tabelle?

Ich möchte Daten aus einem mehrdimensionalen Array in eine HTML-Tabelle ausgeben, die mit insgesamt 8 Spalten formatiert ist (eine Spalte für jeden Tag Mo-So plus eine Spalte links mit den Startzeiten für jede Sitzung)). Die Anzahl der Zeilen hängt davon ab, wie viele Sitzungen für jeden Tag vorhanden sind.

Meine Lösung funktioniert zu einem Grad und Sie können die Ausgabe in der folgenden Abbildung sehen, aber Sie können auch sehen, dass eine zusätzliche Zeile aus irgendeinem Grund generiert wird. Es ist immer nur eine zusätzliche Zeile, unabhängig von der Anzahl der Sitzungen an einem Tag. Current Solution

Die Daten werden wie folgt dargestellt:

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 
      ) 

    ) 

) 

Wie Sie die wichtigsten Tasten, um die Tage der Woche vertreten sehen. 0 = Montag, 1 = Dienstag etc. Jeder Tag hat dann eine Liste von Sitzungen. In diesem Beispiel hat der Montag 3 Sitzungen, und Mi, Do, So haben beide auch einen.

Beachten Sie, dass sie alle unterschiedliche Startzeiten haben. Sobald eine Sitzung mit einer doppelten Startzeit in die Daten eingeführt wird, werden zusätzliche Zeilen erstellt, anstatt die gleiche Zeile zu teilen. Siehe Ausgabe mit der Donnerstag-Sitzung geändert, um 10:00 Uhr, um das gleiche wie Montag zu sein: Buggy Output

Und hier ist meine Buggy-Lösung. Ich habe mit einem Kommentar die Zeile markiert, in der ich falsch liege.

// $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

Woher kennen Sie den Wochentag einer Sitzung? – Misunderstood

+0

Nur wegen der Art, wie die Arrays angeordnet sind. 0 = Montag, 1 = Dienstag usw – Muzzstick

Antwort

0

Das Problem war, dass das Array $ sessionTimes Duplikate mithilfe der Funktion array_unique() entfernt hatte.

Diese Funktion behielt den Index der entfernten Werte. Die zusätzlichen Zeilen wurden also ohne Wert erstellt.

Das Ändern in array_values ​​(array_unique ($ array)) erlaubte regenerierte Schlüssel und behob das Problem.

Dank an alle, die einen Blick an ihm hatte, wünschte ich hätte dies früher realisiert!

0

Hier ist eine alternative Lösung, die weniger Schleifen verwendet.

Was es tut, ist es Schleifen durch die Zeiten, dann Schleifen durch jeden Tag, um festzustellen, ob die Sitzung start_time übereinstimmt, wenn dies der Fall ist, fügen Sie es der Ausgabetabelle.

<?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; 
Verwandte Themen