2016-05-22 9 views
1

Ich habe dieses PHP-Skript, das mehrere Tabellen aus CSV-Daten erstellt. Es funktioniert großartig, aber ich bin mir nicht sicher, wie ich die erste Spalte (Liga) in die Div-Klasse bekommen soll, damit ich sie in ein passendes Eltern-Div mit jquery einfügen kann.CSV-Spaltendaten in Div-Klasse einfügen

<?php 
$csv = "League,Team,Date,Opponent,Result 
american,MIN,May 3,UTA,W 
american,SAC,May 3,DAL,L 
american,SAC,May 4,TOR,W 
american,SAC,May 7,MIL,W 
national,NYN,May 5,BAL,L 
national,NYN,May 7,MIA,W 
national,DET,May 6,DEN,L 
national,DET,May 7,POR,L"; 

$csv_array = explode("\n", $csv); 

$tables = []; 
foreach($csv_array as $key => $value) { 
    if ($key == 0) { 
     continue; 
    } 
    $line = explode(',', $value); 
    if (array_key_exists($line[1], $tables)) { 
     $tables[$line[1]][] = $line; 
    } else { 
     $tables[$line[1]] = [$line]; 
    } 
} 

foreach ($tables as $key => $value) { 
    echo "<div class=\"$line[0]\">"; 
    echo "<table><tr><th>$key</th></tr><tr>"; 
    foreach (explode(',', $csv_array[0]) as $keyHeader => $valueHeader) { 
       if (in_array($keyHeader, [0, 1])) { 
      continue; 
     } 
     echo "<th>$valueHeader</th>"; 
    } 
    echo '</tr>'; 
    foreach ($value as $keyRow => $valueRow) { 
     echo '<tr>'; 
      foreach ($valueRow as $keyValue => $valueValue) { 
       if (in_array($keyValue, [0, 1])) { 
        continue; 
       } 
       echo "<td>$valueValue</td>"; 
      } 
     echo '</tr>'; 
    } 
    echo '</table></div>'; 
} 
?> 

Ich weiß, dass die Daten in $ line [0] ist, aber das ist so viel wie ich herausfinden kann. Danke für jede Hilfe.

Antwort

1

Es ist schwer zu sagen, was mit Ihrem Code Zeile für Zeile vor sich geht, also sollten Sie eine bessere Vorgehensweise in Erwägung ziehen, jeden Schritt zu dokumentieren, was Sie erreichen möchten. Dies wird vor allem dann von Vorteil sein, wenn Sie später versuchen, Ihren eigenen Code einzusehen.

Ich konnte nicht wirklich einen direkten Weg sehen, die entsprechende Liga zu extrahieren, basierend auf der Art, wie Sie Ihre Iteratoren konstruiert haben. Der Grund, dass $line[0] ist immer „national“ ist, denn das ist der letzte Wert, den Sie früher zugewiesen, wenn Sie durch die Liste iteriert:

foreach($csv_array as $key => $value) { 
    if ($key == 0) { 
     continue; 
    } 
    $line = explode(',', $value); 

Ich bin sicher, es ist möglich, mit weniger Redesign, aber wie ich schon sagte, ich war ein wenig unklar mit dem, was jede Codezeile beabsichtigte.

Hinweis: Insbesondere dann, wenn Sie die Fehlerberichterstattung auf hatte, dann würden Sie viel bemerkt haben Offset Nicht definiert: 1 in

if (array_key_exists($line[1], $tables)) { 
    $tables[$line[1]][] = $line; 
} else { 
    $tables[$line[1]] = [$line]; 
} 

Als beiseite, würde dies wahrscheinlich ein Viel einfacher, wenn Sie mehr Kontrolle über das Generieren dieser CSV-Ausgabe hätten, beispielsweise aus einer relationalen Datenbank, dann könnten Sie GROUP BY-Klauseln verwenden und bessere Ausgaben erhalten, die auf Ihre speziellen Bedürfnisse zugeschnitten sind.

Um dieses Problem zu lösen, entschied ich mich zunächst für ein vollständiges Redesign, indem ich zuerst ein analysiertes Array mit allen CSV-Werten bevölkerte.

<?php 
// no need for extra \n's when inside quoted string 
$csv = "League,Team,Date,Opponent,Result 
american,MIN,May 3,UTA,W 
american,MIN,May 4,SEA,L 
american,SAC,May 3,DAL,L 
american,SAC,May 4,TOR,W 
national,NYN,May 5,BAL,L 
national,NYN,May 7,MIA,W 
national,DET,May 6,DEN,L 
national,DET,May 7,POR,L"; 

$csv_array = explode("\n", $csv); 

$headers = explode(",", $csv_array[0]); 

// iterate through all lines of CSV, skipping first header line 
for($i=1;$i<count($csv_array);$i++) { 

    $line = explode(",", $csv_array[$i]); 

    // iterate through all headers and assign corresponding line value 
    foreach ($headers as $index => $header){ 
    $parsed_array[$i][$header] = $line[$index]; 
    } 

} 

Dies gibt Ihnen ein ordentliches assoziatives Array, das wie folgt aussieht:

Array 
(
    [1] => Array 
     (
      [League] => american 
      [Team] => MIN 
      [Date] => May 3 
      [Opponent] => UTA 
      [Result] => W 
     ) 

    [2] => Array 
     (
      [League] => american 
      [Team] => MIN 
      [Date] => May 4 
      [Opponent] => SEA 
      [Result] => L 
     ) 

    [3] => Array 
     (
      [League] => american 
      [Team] => SAC 
      [Date] => May 3 
      [Opponent] => DAL 
      [Result] => L 
     ) 

    [4] => Array 
     (
      [League] => american 
      [Team] => SAC 
      [Date] => May 4 
      [Opponent] => TOR 
      [Result] => W 
     ) 

    [5] => Array 
     (
      [League] => national 
      [Team] => NYN 
      [Date] => May 5 
      [Opponent] => BAL 
      [Result] => L 
     ) 

    [6] => Array 
     (
      [League] => national 
      [Team] => NYN 
      [Date] => May 7 
      [Opponent] => MIA 
      [Result] => W 
     ) 

    [7] => Array 
     (
      [League] => national 
      [Team] => DET 
      [Date] => May 6 
      [Opponent] => DEN 
      [Result] => L 
     ) 

    [8] => Array 
     (
      [League] => national 
      [Team] => DET 
      [Date] => May 7 
      [Opponent] => POR 
      [Result] => L 
     ) 

) 

Jetzt ist es ein ziemlich einfacher Prozess Ihre benutzerdefinierten divs und Tabellen aus diesen Daten zu Erzeugung:

// create divs and tables 
foreach ($parsed_array as $i => $game) { 

    // since we're interested in pairs, then create new div every other one 
    // if odd, then open div/table 
    if ($i % 2 !== 0){ 
    echo " 
     <div class='$game[League]'> 
     <table> 
      <tr> 
      <th>$game[Team]</th> 
      </tr> 
      <tr> 
      <th>Date</th><th>Opponent</th><th>Result</th> 
      </tr> 
    "; 
    } 

    // print data 
    echo " 
      <tr><td>$game[Date]</td><td>$game[Opponent]</td><td>$game[Result]</td></tr> 
    "; 

    // if even, then close div/table 
    if ($i % 2 === 0){ 
    echo " 
     </table> 
     </div> 
    "; 
    } 

} 

Dadurch wird der HTML-Code generiert, wie er in Ihrer Frage mit den korrekten Ligen als div Klassennamen angegeben wurde:

<div class='american'> 
 
    <table> 
 
    <tr> 
 
     <th>MIN</th> 
 
    </tr> 
 
    <tr> 
 
     <th>Date</th><th>Opponent</th><th>Result</th> 
 
    </tr> 
 

 
    <tr><td>May 3</td><td>UTA</td><td>W</td></tr> 
 

 
    <tr><td>May 4</td><td>SEA</td><td>L</td></tr> 
 

 
    </table> 
 
</div> 
 

 
<div class='american'> 
 
    <table> 
 
    <tr> 
 
     <th>SAC</th> 
 
    </tr> 
 
    <tr> 
 
     <th>Date</th><th>Opponent</th><th>Result</th> 
 
    </tr> 
 

 
    <tr><td>May 3</td><td>DAL</td><td>L</td></tr> 
 

 
    <tr><td>May 4</td><td>TOR</td><td>W</td></tr> 
 

 
    </table> 
 
</div> 
 

 
<div class='national'> 
 
    <table> 
 
    <tr> 
 
     <th>NYN</th> 
 
    </tr> 
 
    <tr> 
 
     <th>Date</th><th>Opponent</th><th>Result</th> 
 
    </tr> 
 

 
    <tr><td>May 5</td><td>BAL</td><td>L</td></tr> 
 

 
    <tr><td>May 7</td><td>MIA</td><td>W</td></tr> 
 

 
    </table> 
 
</div> 
 

 
<div class='national'> 
 
    <table> 
 
    <tr> 
 
     <th>DET</th> 
 
    </tr> 
 
    <tr> 
 
     <th>Date</th><th>Opponent</th><th>Result</th> 
 
    </tr> 
 

 
    <tr><td>May 6</td><td>DEN</td><td>L</td></tr> 
 

 
    <tr><td>May 7</td><td>POR</td><td>L</td></tr> 
 

 
    </table> 
 
</div>

+0

Danke für die klare Antwort, Jeff. Meine Daten sind eigentlich '$ csv = file_get_contents ('assets/schedules.csv');' Diese Fehler traten nur auf, wenn ich Dummy-Daten eingab. Das tut mir leid. Dieser array_key_exists-Code teilt jedoch die Tabellen in ihre jeweiligen Teams auf, was notwendig ist, weil sich die Daten ändern, so dass nicht nach Zeilenpaaren, sondern nach eindeutigen Teamnamen gesucht werden sollte. Außerdem musste ich nach jedem Wert in der letzten Spalte (Ergebnis) ein Komma setzen, damit die Daten angezeigt werden und ein undefinierter Indexfehler in der Zeile, die die Daten druckt, verhindert wird. Irgendeine Idee warum? – Beau

+0

@Beau du hast gesagt "Ich musste nach jedem Wert ein Komma setzen", aber meinst du newline '\ n'? –

+0

@Beau Ich denke, ich bin nur blind, weil ich wirklich nicht das Komma sehe, über das du in deiner geposteten Frage sprichst ...Sprechen Sie in den Daten "American, MIN, 3. Mai, UTA, W \ n" oder irgendwo im Code? –