错误从php中的数组中取消设置值

时间:2015-03-16 13:40:30

标签: php

我想从此数组中取消设置所有值,但结果只删除了一半

Ex 1:
$filter = array("English", "Malay", "Student Pass", "NRIC");
for($i=0; $i<count($filter); $i++){
    unset($filter[$i]);
}
print_r($filter);

=&GT;结果Array ( [2] => Student Pass [3] => NRIC )

Ex 2:
$filter = array("English", "Malay");
for($i=0; $i<count($filter); $i++){
    unset($filter[$i]);
}
print_r($filter);

=&GT;结果Array ( [1] => Malay )

3 个答案:

答案 0 :(得分:4)

您的问题是,每次for循环运行时,都会使用count($filter)重新计算数组的长度。因此,for循环的运行频率低于数组中的元素。相反,你应该确定循环的数组长度超前,并且只在循环中使用这个变量:

e.g:

<?
    $filter = array("English", "Malay", "Student Pass", "NRIC");
    $arrayLength = count($filter); // contains the initial length of the array
    for($i=0; $i<$arrayLength;$i++) {
        unset($filter[$i]);
    }
    print_r($filter);
?>

但是,关于整体性能,覆盖数组甚至unset可能更好。

e.g:

// Overwrite it with an empty array
$filter = array();

// Unset it
unset($filter);

答案 1 :(得分:0)

因为当您取消设置数组上的项目时,它会将其删除。所以在下一次迭代中,计数($ filter)现在已经下降了。你可以像@Daan建议的那样做,只需设置$ filter = array()。但是,如果你坚持调用unset,你应该以相反的顺序遍历数组。

for($i = count($filter) - 1; $i >= 0; $i--) {
    unset($filter[$i]);
}

答案 2 :(得分:0)

每次unset元素count($filter)减少。让我举个例子:

你有六个苹果。你正在吃第n个苹果,而n小于苹果的数量。所以,你吃第0个苹果,因为0&lt;你有5个苹果。你吃第一个苹果,因为1&lt;你有4个苹果。你吃了第二个苹果,因为2&lt;你有3个苹果。你不吃第3个苹果,因为3&lt; 3不是这样。结果,将留下三个苹果。你的错误是假设当且仅当数组不为空时,递增的index比递减的count慢。这是错误的,你需要一个不同的方法,如:

while (count($filter) > 0) {
   unset($filter[count($filter) - 1]);
}

这是次优的,只是取消设置数组,如下所示:

unset($filter);