尝试使用以下代码删除小于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的元素。有什么想法吗?
答案 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
以打印$i
和count($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)
使用现有的循环添加优秀的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]);
}
}