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

时间:2018-02-14 22:02:10

标签: php arrays unset

尝试使用以下代码删除小于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的元素。有什么想法吗?

6 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:4)

如果你真的需要在循环中进行,你可以通过使用foreach循环来避免这个问题。

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

您可以使用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 :(得分:2)

这是因为你正在迭代它时操纵数组,这可以使它偏移并跳过元素。解决此问题的一种常见方法是向后循环:

   $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>';

答案 5 :(得分:2)

使用现有的循环添加优秀的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]);
    }
}