【问题标题】:Differences in iteration between PHP's foreach and for [duplicate]PHP的foreach和for [重复]之间的迭代差异
【发布时间】:2020-01-05 21:19:51
【问题描述】:

我可以使用 foreach 遍历 PHP 数组,但不能使用 for 循环:

这不起作用:

for($j = 0; $j < sizeof($jobsFilterA); $j++) {
    echo $j . $jobsFilterA[$j] . "<br>";
}

这样做:

foreach($jobsFilterA as $job) {
    echo $job . "<br>";
}

我有 5 个不同的数组,其中一些是从数据库提取中简单构建的,另一些是通过删除特定索引构建然后修剪的。

由于使用了 unset 函数,现在我把这些都输入了,感觉我刚刚得到了空索引。

我可以删除未设置的索引或重建数组的正确方法吗?

提前致谢!

尝试以不同的方式迭代多个不同的数组。

代码在上面。

for 循环中未设置的索引会引发未定义的偏移异常/错误。

最后,这5个数组需要回显到一个表中。 我一直在通过这样的 for 循环来做到这一点:

/*
*                   Echo data into a table
*/
echo '<tbody>';
for($i=0; $i < sizeof($jobsFilterA); $i++){
    echo "<tr><td>" . strtoupper(substr($custLastNames[$i], 0, 4)) . "</td>";
    echo "<td width='100'>" . $jobsFilterA[$i] . "</td>";
    echo "<td>" . $waxDueDates[$i] . "</td>";
    echo "<td>" . $dayDifferences[$i] . "</td>";
    echo "<td>" . $revisedETAs[$i] . "</td></tr>";
}
echo '</tbody>'

这就是为什么我希望我可以重新组织数组,以便它们的数据被索引对齐/连续。

【问题讨论】:

  • 如果您在数字序列上使用了unset,除非取消设置最后一个索引,那么for 将失败,因为您将访问一个不再存在的键(并将收到警告)。例如。如果你有一个数组['a', 'b', 'c', 'd'] 并且你取消设置索引2,你最终会得到[0 =&gt; 'a', 1 =&gt; 'b', 3 =&gt; 'd'],但你的forloop 不知道,所以当$j 为2 时你的代码仍然检查$jobsFilterA[2]。如果你真的想使用for,您可以使用例如重置键array_values.
  • 如果您只想检查其他数组中$jobsFilterA 中的相同索引,另一个选项是foreach($jobsFilterA as $i =&gt; $job),那么您可以访问例如$waxDueDates[$i] 其中 $i 是与 $jobsFilterA 的当前迭代相同的索引。还有其他各种方法可以做到这一点。
  • @Jonnix 这两个 cmets 的组合几乎就是答案。你应该发布...
  • 好点。完成。

标签: php


【解决方案1】:

如果您在数字序列上使用了unset(取消设置最后一个索引的情况除外),那么for 将失败,因为您将访问一个不再存在的键(并且将收到警告)。

例如如果你有一个数组['a', 'b', 'c', 'd'] 并且你取消了索引2,你最终会得到[0 =&gt; 'a', 1 =&gt; 'b', 3 =&gt; 'd'],但是你的for 循环不知道这一点,所以当$j 是@ 时,你的代码仍然会检查$jobsFilterA[2] 987654329@。如果您真的想使用for,您可以使用例如重置密钥array_values 会给你[0 =&gt; 'a', 1 =&gt; 'b', 2 =&gt; 'd'],你现有的for 可以使用。

如果您只想检查其他数组中$jobsFilterA 中的相同索引,另一个选项是使用foreach($jobsFilterA as $i =&gt; $job),那么您可以访问例如$waxDueDates[$i] 其中$i 是与$jobsFilterA 的当前迭代相同的索引。还有其他各种方法可以做到这一点。

【讨论】:

  • 非常感谢您的帮助!在使用方面,我只是 $repairedArray = array_values($arrWithUnsetIndices)
  • @Mikey 是的,应该可以。
猜你喜欢
  • 2011-03-12
  • 2018-07-24
  • 1970-01-01
  • 2016-04-01
  • 2011-04-29
  • 2011-09-26
  • 2019-06-06
  • 2012-11-21
  • 2012-12-16
相关资源
最近更新 更多