在数组中使用 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】:添加优秀的foreach
和array_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
以打印$i
和count($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>0
中的>=
,我在评论后编辑到$i>=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删除数组中元素的区别