2017-01-27 1 views
-1

for 루프를 통해 PHP에서 2 차원 배열을 채우기 위해 노력하고 있습니다. 함수는 일치하는 일정을 생성하는 것입니다. 특정 이유로 PHP 페이지에서 정의되지 않은 오프셋을 반향시킵니다. .. 어떤 도움이라도?for 루프를 통해 2 차원 배열에 데이터 삽입

<?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 블록의 문을 업데이트해야합니다. 그러면 다음과 같이 보입니다.

 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까지 반복하는 대신 정확하게 요소 수를 반복해야합니다. 그래서 0sizeof($matches)까지 :

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

동일은 당신의 내면의 for 루프 간다. $matches의 각 행에 배열이 sizeof($matches[$row])를 통해 다른 요소의 수, 루프 가질 수 있기 때문에 : 당신이 배열의 모든 요소를 ​​반복하는 두 경우 모두 이후

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

을, 나는 그것이 겠 foreach 루프를 언급 해주십시오. 이 목적을 위해 존재합니다. 귀하의 코드는 foreach 문을 사용하여 비트를 단순화 할 수 있습니다

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

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

    echo "</tr>"; 
} 

공지 사항 난 당신의 라인을 교체 :

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] 여러 번 인쇄는 인쇄 것입니다 모든 열에서 정확히 동일한 값을 사용합니다. 이는 사용자가하려는 것이 아닙니다. 2) 반복 할 때마다 한 번에 한 열 (td) 만 인쇄하면됩니다.

그래서이 루프 밖에서 행 열기 및 닫기 태그를 이동하고 반복마다 열 데이터 만 인쇄해야합니다.그래서 코드는 다음과 같습니다

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 루프를 훨씬 더 쉽게 고려할 것입니다 ... 감사합니다. –

관련 문제