在数组中使用 unset() 函数删除元素

Posted

技术标签:

【中文标题】在数组中使用 unset() 函数删除元素【英文标题】:Using unset() function in an array to delete elements 【发布时间】:2018-07-25 14:30:57 【问题描述】:

尝试使用以下代码删除数组(如下所示)中小于 0 的所有元素:

 <?php 
       $arr=array(1,2,3,4,5,-6,-7,-8,-9,-10);

        for ($i=0;$i<count($arr);$i++)
                if ($arr[$i]<0) 
                unset($arr[$i]);
                
        

    var_dump($arr);

    echo '<pre>', print_r($arr), '</pre>';

    ?>

但是,结果如下:

array(7)  [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [8]=> int(-9) [9]=> int(-10) 
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [8] => -9
    [9] => -10
)
1

很困惑为什么不从数组中删除所有小于 0 的元素。对此有什么想法吗?

【问题讨论】:

如果它解决了您的问题,您应该接受答案。 【参考方案1】:

添加优秀的foreacharray_filter 答案(详细说明问题),使用您现有的循环,首先使用count,这样它就不能更改每次迭代:

$arr=array(1,2,3,4,5,-6,-7,-8,-9,-10);

$c = count($arr);

for ($i=0; $i<$c; $i++)
    if ($arr[$i]<0) 
        unset($arr[$i]);
    

【讨论】:

对于for 循环迭代的一般建议。 Nice anwser too :) 对于大型阵列来说可能是一个更好的选择。不创建函数或变量副本。 在看到这个答案之前刚刚应用了这个。非常感谢您的通知。【参考方案2】:

如果您确实需要在循环中执行此操作,则可以改用 foreach 循环来避免该问题。

foreach ($arr as $key => $value) 
    if ($value < 0) 
        unset($arr[$key]);
    

在迭代时删除元素不会导致任何问题。

【讨论】:

很惊讶这并没有遇到同样的问题。不错的一个 foreach 复制数组以进行迭代。【参考方案3】:

您可以使用array_filter() 执行此操作。第二个参数是一个匿名函数,它以数组元素为参数。在内部,您必须确定是否应该保留它。

$arr=array(1,2,3,4,5,-6,-7,-8,-9,-10);
$arr = array_filter($arr, function($e) 
    return $e >= 0 ; // keep only element greater than zero
);
echo '<pre>', print_r($arr), '</pre>';

输出:

array(5) 
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)

【讨论】:

优雅的解决问题的方法。谢谢!【参考方案4】:

您正在使用count($arr) 进行迭代,每次迭代后都会重新评估。由于您删除了一个项目,因此数组变得更短。同时你增加你的迭代器。这一直有效,直到您到达倒数第二个项目,删除该项目并增加计数器会使循环条件为假,从而跳过最后一个元素。

您可以在循环中执行echo 以打印$icount($arr) 以查看详细信息。

【讨论】:

【参考方案5】:

这是因为您在对数组进行正向迭代时正在对其进行操作,这可能会使其偏移并跳过元素。解决此问题的一种常见方法是向后循环:

   $arr=array(1,2,3,4,5,-6,-7,-8,-9,-10);

    for ($i=count($arr)-1;$i>=0;$i--)
            if ($arr[$i]<0) 
            unset($arr[$i]);
            
    

var_dump($arr);

echo '<pre>', print_r($arr), '</pre>';

【讨论】:

致 Phil: 嗯... count($arr) 在这种情况下返回 10,因此 $i=count($arr)-1 产生 9。因此,$i 从 9 下降到 0 .所有的元素都参与了。我有错误的印象吗? @Sam 是因为我错过了$i&gt;0中的&gt;=,我在评论后编辑到$i&gt;=0【参考方案6】:

当您在向前遍历集合时删除元素时,通常会发生这种情况。您最终会丢失元素,因为您正在尝试迭代移动目标。一种解决方案是向后迭代

for ($i = count($arr) - 1; $i >= 0; $i--)

另一种方法是简单地使用array_filter 创建一个新数组

$newArr = array_filter($arr, function($num) 
    return $num >= 0;
);

【讨论】:

非常感谢您提供适当的帖子!

以上是关于在数组中使用 unset() 函数删除元素的主要内容,如果未能解决你的问题,请参考以下文章

(实用篇)PHP中unset,array_splice删除数组中元素的区别

PHP中unset,array_splice删除数组中元素的区别

PHP从数组中删除元素的四种方法实例

删除数组元素并重建索引的方法

如何在 PHP 中对这个线性链表使用 unset()

unset()