[英]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);
?>
您的代码有几个问题:
echo '</table>';
)您收到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
,而是应该循环遍历元素的确切数量。 所以从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 可以稍微简化您的代码:
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.