【问题标题】:Unset array element inside a foreach loop在 foreach 循环中取消设置数组元素
【发布时间】:2011-02-20 14:16:02
【问题描述】:

这是我的代码:

<?php

$arr = array(array(2 => 5),
             array(3 => 4),
             array(7 => 10));

foreach ($arr as $v) {
    $k = key($v);
    if ($k > 5) {
        // unset this element from $arr array
    }
}

print_r($arr);

// now I would like to get the array without array(7 => 10) member

如你所见,我从一个单键 => 值数组的数组开始,我循环遍历这个数组并获取当前元素的一个键(这是一个单项数组)。

我需要取消设置 key 大于 5 的数组元素,我该怎么做?我可能还需要删除值小于 50 或任何其他条件的元素。基本上我需要能够获取当前数组项的键,它本身就是一个包含单个项的数组。

【问题讨论】:

标签: php


【解决方案1】:

使用key() 从子数组中获取第一个键。

foreach($arr as $k => $v) {
    if(key($v) > 5) {
        unset($arr[$k]);
    }
}

【讨论】:

  • 嗯,不,当我编辑我的回复时,我实际上并没有意识到你的回答。两个答案相同的事实更多是因为手头任务的基本性导致许多人以相同的方式完成它(循环的内部与我编辑之前基本相同;外部几乎是foreach 循环的标准)。
【解决方案2】:
foreach($arr as $k => $v) {
    if(key($v) > 5) {
        unset($arr[$k]);
    }
}

【讨论】:

  • facepalm...我完全忘记了 $k => $v 语法,我的记忆越来越差了。
  • 使用$k和key($v)有什么区别,不一样吗?只是问因为下面的每个示例也使用 key($v) 不知道为什么当我认为可以直接使用 $k 时。
  • @Haider 你只是误解了key($v) 的用途。它获取子数组的键 $v,而不是被迭代的数组的任何键。对于第一个元素,$k == 0$v == array(2 =&gt; 5)key($v) == 2
【解决方案3】:

在遍历集合时添加或删除集合并不安全。将您想要的元素添加到第二个数组,然后转储原始元素怎么样?

【讨论】:

  • foreach PHP 中的循环在默认提供的数组副本上迭代(除非它通过引用显式传递)。
  • 参考与复制不是我的观点,也不相关。在迭代期间改变数组是不好的形式。
  • 除非你改变你正在迭代的数组,因为你正在迭代的数组是副本原版的。在迭代时改变一个 different 数组并不是坏的形式,因此从一个非引用传递的 foreach 循环中改变原始数组也不是坏的形式,因为原始数组是一个不同的数组.
  • 这在技术上可能是正确的,但从语义上讲,开发人员认为他在迭代时删除了一些东西,我认为这是糟糕的设计,尤其是当像 foreach 这样的关键字暗示只读遍历时。它会起作用,但这种做法会使代码难以维护。
  • foreach 如何建议只读?它表明您正在为传递的事物中的每个 项做某事,这正是您正在做的事情。这并没有说明这些项目中的任何一个之后是否仍会出现在原始数组中。
【解决方案4】:

在 PHP 中,在使用 foreach 循环迭代数组时从数组中删除元素是安全的:

foreach ($arr as $key => $value) {
    if (key($value) > 5) {
        unset($arr[$key]);
    }
}

【讨论】:

  • 请注意,这实际上并没有做 OP 想要的(但您的观点大部分是正确的 - 在 foreach 循环的上下文中这样做是安全的;其他形式的迭代不是始终添加/删除安全)。
  • @Amber,谢谢,我错过了给出数组数组的事实,我已经更正了这个例子。还添加了关于 foreach 循环的注释。
【解决方案5】:

要取消设置数组元素,我们使用了 unset() 和 php 函数,如下所示:

foreach($array as $key=>$value)
{
   if(key($value) > 5) 
   {
      unset($array[$key]);
   }
}

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 2013-10-23
    • 2019-04-13
    • 2017-05-05
    • 2011-01-01
    • 2013-04-11
    • 2015-03-07
    • 2012-02-15
    • 2019-05-11
    相关资源
    最近更新 更多