2016-05-22 2 views
1

私はcsvデータから複数のテーブルを作成するこのPHPスクリプトを持っています。それは素晴らしい作品ですが、私はjqueryと一致する親divにそれぞれを追加できるようにdivクラスに最初の列(リーグ)を取得する方法がわかりません。DivクラスにCSV列データを入れよう

<?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>'; 
} 
?> 

私はデータが$ line [0]にあることを知っていますが、それは私が把握できるほどです。助けてくれてありがとう。

答えて

1

コードごとに行ごとに何が起こっているのかを実際に伝えるのは難しいので、達成しようとしていることを文書化する方法の各ステップをコメントする方がよいでしょう。後で自分のコードを見ようとすると、ほとんどの場合これは役に立ちます。

イテレータを構築した方法に基づいて、リーグを抽出する直接的な方法は実際には分かりませんでした。それはあなたがリストを反復処理するときに、以前に割り当てられた最後の値だから$line[0]は常に「国家」であることの理由は次のとおりです。

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

私はそれが少ない再設計で可能だと確信していますが、私が言ったように、Iコードの各行が何を意図しているのかが少し不明でした。

お知らせ:不定オフセット:1余談として

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

で、これはおそらくだろうあなたは上のエラー報告があった場合は特に、あなたはの多くは気づいているだろうリレーショナルデータベースからCSV出力を生成することをより制御できれば、GROUP BY句を使用して特定のニーズに合わせてより良い出力を得ることができます。

これを解決するために、私は最初にすべてのCSV値を解析された配列に読み込むことで完全な再設計を選択しました。

<?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]; 
    } 

} 

これはあなたにこのようになります整頓連想配列を与える:

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 
     ) 

) 

は、今では、このデータからカスタムdivタグやテーブルを生成するかなり簡単なプロセスです:

// 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> 
    "; 
    } 

} 

これはあなたの質問にdivクラスの名前として正しいリーグを提供するようにHTMLを生成します:

明確な答え、ジェフのためのの

<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

感謝。私のデータは実際には '$ csv = file_get_contents(assets/schedules.csv ');'これらのエラーは、ダミーデータを入れたときにのみ発生します。申し訳ありません。しかし、そのarray_key_existsコードはテーブルをそれぞれのチームに分割していました。これはデータが変更されるので必要です。ラインのペアではなく、探しているはずのユニークなチーム名です。また、最後の列(結果)に各値の後にコンマを入れて、データを表示し、データを印刷している行の未定義のインデックスエラーを防ぐ必要がありました。どんな考え? – Beau

+0

@Beauあなたは「各値の後にコンマを入れなければならない」と言ったが、改行 '\ n'を意味するのだろうか? –

+0

@Beau投稿された質問であなたが話しているコンマは本当に表示されないので、私は盲目だと思います...あなたはデータ 'アメリカン、MIN、5月3日、UTA、W \ n'またはコードのどこかで話していますか? –

関連する問題