Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在foreach循环中取消设置数组元素_Php - Fatal编程技术网

Php 在foreach循环中取消设置数组元素

Php 在foreach循环中取消设置数组元素,php,Php,这是我的代码: <?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); //

这是我的代码:

<?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
用于从子数组中获取第一个密钥

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

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

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

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

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

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

PHP中的
foreach
循环在默认情况下提供的数组副本上迭代(除非它是通过引用显式传递的)。引用与复制不是我的观点,也不相关。在迭代过程中对数组进行变异是一种不好的形式。除了你没有对你正在迭代的数组进行变异,因为你正在迭代的数组是原始数组的副本。在迭代过程中改变一个不同的数组不是一种坏形式,因此从一个未引用的foreach循环中改变原始数组也不是一种坏形式,因为原始数组是一个不同的数组。这在技术上可能是正确的,但从语义上讲,开发人员认为他在迭代过程中删除了一些我认为是糟糕的设计的东西,尤其是像foreach这样的关键字表示只读遍历时。它会起作用,但这种做法使代码的可维护性很差。
foreach
如何建议只读?它表明您正在为传递的内容中的每个项目做一些事情,这正是您正在做的。这并不能说明这些项之后是否仍然存在于原始数组中。请注意,这实际上并不能满足OP的要求(但您的观点基本上是正确的-在
foreach
循环中这样做是安全的;其他形式的迭代并不总是添加/删除安全的)。@Amber,谢谢,我忽略了给出数组数组的事实,我已经更正了这个示例。还添加了关于
foreach
loop.facepalm的注释。。。我一时完全忘记了$k=>$v语法,我的记忆力越来越差。使用$k和key($v)有什么区别,不是吗?只是问一下,因为下面的每个例子都使用key($v),我不知道为什么我认为可以直接使用$k。@海德尔,你只是误解了key($v)
的用途。它获取子数组的键,即
$v
,而不是正在迭代的数组的任何键。对于第一个元素,
$k==0
$v==array(2=>5)
,和
key($v)==2
。嗯,不,我编辑我的响应时,实际上不知道您的答案。这两个答案是相同的,更多的是因为手头任务的基本性质导致许多人以相同的方式完成它(循环的内部与我编辑它之前基本相同;外部几乎是
foreach
循环的标准)。可能重复
foreach($array as $key=>$value)
{
   if(key($value) > 5) 
   {
      unset($array[$key]);
   }
}