繁体   English   中英

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

[英]Inserting data in two dimensional array through for loop

我正在尝试通过 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);

?>

您的代码有几个问题:

  1. 数组匹配未填充。
  2. 你的桌子没有完成( echo '</table>';
  3. 用括号结束“if elseif else”更容易。

您收到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>";
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM