通过for循环在二维数组中插入数据

时间:2017-01-27 11:24:04

标签: php arrays

我试图通过for循环在php中填充二维数组,该函数是关于生成匹配计划,由于某种原因,php页面回应未定义的偏移...任何帮助?

<?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);

&GT;

2 个答案:

答案 0 :(得分:0)

您的代码存在几个问题:

  1. 未填充数组匹配。
  2. 您的表格未完成(echo '</table>';
  3. 更容易结束你的“如果别的话”#39;括号。

答案 1 :(得分: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将被填满。但是,还有更多问题会导致undefined offset警告。

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

这里有两个问题: 1)多次打印$matches[$row][$col]将在每列中打印完全相同的值,这不是您想要做的。 2)您只需要循环打印1列(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>";
    }

}