首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unset()的问题

unset()的问题
EN

Stack Overflow用户
提问于 2014-06-30 15:58:39
回答 3查看 56关注 0票数 1

为演示目的而哑口无言

  • PHP 5.27 (必需)。
  • 错误报告已开启。

如果数组$unset的属性之一$list['id']存在于数组$unset中,则尝试使用数组$unset来取消关联数组的$unset值。

然而,我在这里很难理解结果:

代码语言:javascript
复制
<?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 />';
}

输出:

代码语言:javascript
复制
Itteration: 0
Contest ID: foo
Not in Array: False

Itteration: 1
Contest ID: bar
Not in Array: True

不管$unset中有多少值,我只成功地运行了2次迭代。

当我删除unset($list[$i]);时,我们成功地遍历了$list

代码语言:javascript
复制
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])只是为了好玩,结果没有改变。

我在这里错过了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-30 16:09:04

以下是@niet的回答:

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

代码语言:javascript
复制
for($i = 0; $i < count($list); $i++) {

代码语言:javascript
复制
$cnt = count($list);
for ($i = 0; $i < $cnt; $i++) {

在第一个循环中,每次循环迭代都会对count()进行评估,因此当您从列表中删除项时,count($list)也会减少。

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

票数 1
EN

Stack Overflow用户

发布于 2014-06-30 16:03:07

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

试试foreach($list as $i=>$item) {

票数 7
EN

Stack Overflow用户

发布于 2014-06-30 16:13:07

问题是每次计算数组项的数量。它有两个缺点:如果您取消了项(在本例中),您的循环不能按预期的方式工作,此外,您还会丢失性能(在每个数组的迭代次数中,必须再次计算)。

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

代码语言:javascript
复制
for ($i=0; $i < count($list); $i++) {

转到

代码语言:javascript
复制
for ($i=0, $c = count($list); $i <$c; ++$i) {

实际上,您几乎每次使用for循环时都可以使用此方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24494267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档