【问题标题】:Using unset() function in an array to delete elements在数组中使用 unset() 函数删除元素
【发布时间】: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 的元素。对此有什么想法吗?

【问题讨论】:

  • 如果它解决了您的问题,您应该接受答案。

标签: php arrays unset


【解决方案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;
    });
    

    【讨论】:

    • 非常感谢您提供适当的帖子!
    猜你喜欢
    • 2020-03-15
    • 2015-01-19
    • 1970-01-01
    • 2013-12-25
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多