2017-01-27 11 views
-1

私はforループを使ってphpで2次元配列を塗りつぶそうとしていますが、関数は一致するスケジュールを生成しています。 ..どんな助け? ?2次元配列のデータをforループで挿入する

<?php 
function generateMatches($size) 
{ 
    $matches = array(); 
    $step = 3; 
    if ($size % 4 == 0) 
    { 
     for ($i = 0; $i < ($size - $step); $i++) 
     { 
      if ($i < $size/4) 
      { 
       array($i + 1, $i + $step, $i + (2 * $step), $i + (3 * $step)); 
      } 
      else if ($i >= ($size/4) && $i < ($size/2)) 
       array($i + 1, $i + $step, $i + (2 * $step)); 
      else 
       array($i + 1, $i + $step); 
     } 
    } 
    echo "<table> 
      <tr> 
       <td> Team # </td> 
       <td> Oppenent 1 </td> 
       <td> opponent 2 </td> 
       <td> opponent 3 </td> 
      </tr> 
      <tr>"; 

    for ($row = 0; $row < 13; $row++) 
     for($col = 0; $col < 4; $col++) 
      echo "<tr> <td>". $matches[$row][$col]. "</td><td>". $matches[$row][$col] . "</td><td>". $matches[$row][$col] . "</td><td>". $matches[$row][$col]; 
} 
generateMatches(12); 

>

+0

あなたが取得している、あなたはそれを解決するために試してみたものを完全なエラーを記載してくださいあなたがいるので、あなたは未定義のオフセット誤差を取得している理由は、配列に存在しないキー/値を呼び出そうとします。つまり、配列が正しく読み込まれているかどうかを確認する必要があります。 – Epodax

答えて

0

あなたのコードとのserveral問題があります。

  1. 配列の一致が満たされていないが。
  2. テーブルが完成していません(echo '</table>';
  3. 「if else else」を角カッコで囲むのは簡単です。
0

undefined offset警告が表示される理由は、存在しない配列キーを参照しているためです。

ロジックは、$matchesアレイにデータを保存することはありません。

ifブロックのステートメントを$matches[$i] =に更新する必要があるようです。したがって、次のようになります。

 if ($i < $size/4) { 
      $matches[$i] = array($i + 1, $i + $step, $i + (2 * $step), $i + (3 * $step)); 

     } else if ($i >= ($size/4) && $i < ($size/2)) { 
      $matches[$i] = array($i + 1, $i + $step, $i + (2 * $step)); 

     } else { 
      $matches[$i] = array($i + 1, $i + $step); 
     } 

ここで$matchesが入力されます。しかし、さらに多くの問題があり、警告が表示されます。

forループでは、静的な回数だけループしています。しかし、$matches配列のサイズが要素の数が異なる場合は考慮しません。

0から12にループするのではなく、正確な要素数をループする必要があります。だから、0からsizeof($matches)へ:

for ($row = 0; $row < sizeof($matches); $row++) 

同じことがあなたの内側のforループのために行きます。 $matchesの各行のあなたの配列が異なる数の要素、sizeof($matches[$row])をループすることができますのでこれらの例の両方で、あなたは、アレイ内のすべての要素を反復しているので

for ($col = 0; $col < sizeof($matches[$row]); $col++) 

を、私はそれがだと仮定しますループはforeachループと言えます。この目的のために存在します。あなたのコードは、foreachのを使用してビットを単純化することができます。

echo "<tr> <td>". $matches[$row][$col]. "</td><td>". $matches[$row][$col] . "</td><td>". $matches[$row][$col] . "</td><td>". $matches[$row][$col]; 

ここ2つの問題があります: 1)$matches[$row][$col]を複数回印刷する印刷しようとしているが、私はあなたの行を置き換え

foreach ($matches as $row) { 
    echo "<tr>"; 

    foreach ($row as $col) { 
     echo "<td>" . $col . "</td>"; 
    } 

    echo "</tr>"; 
} 

お知らせあなたがやろうとしているのではない、すべての列でまったく同じ値です。 2)ループするので、一度に1列(td)だけ印刷する必要があります。

このループの外側で行の開閉タグを移動し、繰り返しごとに1回のみ列データを印刷する必要があります。だから、コードは次のようになります。

foreach ($matches as $row) { 
    echo "<tr>"; 

    foreach ($row as $col) { 
     echo "<td>" . $col . "</td>"; 
    } 

    echo "</tr>"; 
} 

は、私はあなたが望む正確な結果を得るためにあなたのロジックにいくつかの調整をやろうとしている感じを持っていますが、今は警告の理由を知っているとどのようにそれらを止める。 foreachを使用すると、コードが少しでも整理されます。だから、うまくいけば、これは良いスタートです..!ここで

は、新しいコードは完全です:

function generateMatches($size) 
{ 
    $matches = array(); 
    $step = 3; 

    if ($size % 4 == 0) { 
     for ($i = 0; $i < ($size - $step); $i++) { 

      if ($i < $size/4) { 
       $matches[$i] = array($i + 1, $i + $step, $i + (2 * $step), $i + (3 * $step)); 

      } else if ($i >= ($size/4) && $i < ($size/2)) { 
       $matches[$i] = array($i + 1, $i + $step, $i + (2 * $step)); 

      } else { 
       $matches[$i] = array($i + 1, $i + $step); 

      } 
     } 

    } 

    echo "<table><tr><td> Team # </td><td>Opponent 1</td><td>opponent 2</td><td>opponent 3</td></tr>"; 


    foreach ($matches as $row) { 
     echo "<tr>"; 

     foreach ($row as $col) { 
      echo "<td>" . $row[$col] . "</td>"; 
     } 

     echo "</tr>"; 
    } 

} 
+0

私は長い仕事の後でそれが気付いた!私は自分のコードを調整し、今はうまくいきますが、私は印刷のためのforeachループを考えています。ずっと簡単です...ありがとう –

関連する問題