与unset()有关的问题 为了便于说明,将其简化 PHP 5.27(必选) 错误报告已打开

与unset()有关的问题 为了便于说明,将其简化 PHP 5.27(必选) 错误报告已打开,php,arrays,unset,Php,Arrays,Unset,我试图使用数组$unset来取消关联数组$list的值,前提是数组$list['id']中存在一个属性$unset 然而,我很难理解这里的结果: <?php $list = array( array( 'id' => 'foo' ), array( 'id' => 'bar' ), array( 'id' => 'baz' ), array( 'id' => 'quix' ) ); $unset =

我试图使用数组
$unset
来取消关联数组
$list
的值,前提是数组
$list['id']
中存在一个属性
$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 />';
}
无论
$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
我找不到解释为什么会发生这种情况。文档提到的唯一警告是在globals上的函数中使用
unset
。我甚至尝试了
unset($GLOBALS['list'][$I])
只是为了好玩,结果没有改变


我在这里遗漏了什么?

这是因为当你删除项目时,
count($list)
会变得越来越小


请尝试使用
foreach($i=>$item){

这是因为
count($list)
在删除项目时不断变小


尝试
foreach($i=>$item){

来扩展@niet的答案:

这两个是完全不同的循环:

for($i = 0; $i < count($list); $i++) {
($i=0;$i{

$cnt=count($list);
对于($i=0;$i<$cnt;$i++){
在第一个循环中,
count()
在每次循环迭代中都会被计算,因此当您从列表中删除项目时,
count($list)
也会减少


在第二个循环中,您对列表计数一次,缓存该值,然后每次检查缓存的值。第二个循环将迭代
列表
数组中的所有项目,因为您使用的是固定的目标柱。第一个循环每次都将目标柱移近。

要扩展@niet的答案:

这两个是完全不同的循环:

for($i = 0; $i < count($list); $i++) {
($i=0;$i{

$cnt=count($list);
对于($i=0;$i<$cnt;$i++){
在第一个循环中,
count()
在每次循环迭代中都会被计算,因此当您从列表中删除项目时,
count($list)
也会减少


在第二个循环中,您对列表计数一次,缓存该值,然后每次检查缓存的值。第二个循环将迭代
列表
数组中的所有项,因为您使用的是固定的goalPost。第一个循环每次都将goalPost移动得更近。

问题是您计算数组项的数量它有两个缺点:如果像本例中那样取消设置项,则循环不能按预期工作,而且性能也会降低(在每次迭代中,必须再次计算数组的数量)

循环的最佳解决方案是更改:

for ($i=0; $i < count($list); $i++) {
($i=0;$i{
进入


对于($i=0,$c=count($list);$i问题在于每次都要计算数组项的数量。它有两个缺点:如果像在本例中那样取消设置项,则循环无法按预期工作,此外,性能也会降低(在每次迭代中,必须再次计算数组数)

循环的最佳解决方案是更改:

for ($i=0; $i < count($list); $i++) {
($i=0;$i{
进入


for($i=0,$c=count($list);$i换句话说:
for(…count())
在循环的每次迭代中都计算count(),因此它反映了当前的“活动”数组的计数,而不是循环开始前数组中的计数。这是一个多么愚蠢的错误,谢谢。我最后分配了一个变量来计数并使用它。换句话说:
for(…count())
在循环的每次迭代中都计算count(),因此它反映了当前的“活动”数组的计数,而不是循环开始前数组中的计数。这是一个多么愚蠢的错误,谢谢。我最终分配了一个变量来计数并使用它。这就是我最终要做的,将计数分配给一个变量并使用它。我不知道为什么我会这样做。如果你不在10秒内更改数组,你会没事的他循环。但既然你是,你的循环条件也在变化。作为选择这个作为答案的解释,它给出了在当前上下文中的原因和解决方案。这就是我最终要做的,是给一个变量赋值计数并使用它。我不知道为什么我会通过它。如果你不是chan,你会没事的在循环中调整数组。但是,既然是,循环条件也在变化。作为选择此作为答案的解释,它给出了在当前上下文中的原因和解决方案的解释。
for ($i=0, $c = count($list); $i <$c; ++$i) {