我试图通过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;
答案 0 :(得分:0)
您的代码存在几个问题:
echo '</table>';
)答案 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
,而是应该循环确切的元素数量。所以从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>";
}
}