为演示目的而哑口无言
如果数组$unset的属性之一$list['id']存在于数组$unset中,则尝试使用数组$unset来取消关联数组的$unset值。
然而,我在这里很难理解结果:
<?php
$list = array(
array(
'id' => 'foo'
),
array(
'id' => 'bar'
),
array(
'id' => 'baz'
),
array(
'id' => 'quix'
)
);
$unset = array(
'foo',
);
for ($i=0; $i < count($list); $i++) {
echo "Itteration: {$i}" . '<br />';
echo "Contest ID: {$list[$i]['id']}" . '<br />';
echo 'Not in Array: ', (!in_array($list[$i]['id'], $unset)) ? 'True' : 'False';
unset($list[$i]); // Trouble Section
echo '<br /><br />';
}输出:
Itteration: 0
Contest ID: foo
Not in Array: False
Itteration: 1
Contest ID: bar
Not in Array: True不管$unset中有多少值,我只成功地运行了2次迭代。
当我删除unset($list[$i]);时,我们成功地遍历了$list
Itteration: 0
Contest ID: foo
Not in Array: False
Itteration: 1
Contest ID: bar
Not in Array: True
Itteration: 2
Contest ID: baz
Not in Array: True
Itteration: 3
Contest ID: quix
Not in Array: True我找不到在医生里为什么会发生这种情况的解释。文档中唯一提到的警告是在全局函数中使用unset。我甚至尝试unset($GLOBALS['list'][$i])只是为了好玩,结果没有改变。
我在这里错过了什么?
发布于 2014-06-30 16:09:04
以下是@niet的回答:
这两个循环是完全不同的:
for($i = 0; $i < count($list); $i++) {和
$cnt = count($list);
for ($i = 0; $i < $cnt; $i++) {在第一个循环中,每次循环迭代都会对count()进行评估,因此当您从列表中删除项时,count($list)也会减少。
在第二个循环中,对列表进行一次计数,缓存该值,然后每次检查缓存的值。第二个循环将迭代list数组中的所有项,因为您使用的是固定的目标柱。第一圈每一次都使门柱更加紧密。
发布于 2014-06-30 16:03:07
这是因为当您删除项目时,count($list)会变得越来越小。
试试foreach($list as $i=>$item) {
发布于 2014-06-30 16:13:07
问题是每次计算数组项的数量。它有两个缺点:如果您取消了项(在本例中),您的循环不能按预期的方式工作,此外,您还会丢失性能(在每个数组的迭代次数中,必须再次计算)。
循环的最佳解决方案是更改:
for ($i=0; $i < count($list); $i++) {转到
for ($i=0, $c = count($list); $i <$c; ++$i) {实际上,您几乎每次使用for循环时都可以使用此方法。
https://stackoverflow.com/questions/24494267
复制相似问题