PHP未设置未按预期工作

时间:2013-10-04 23:39:46

标签: php arrays for-loop unset array-unique

我只是想删除所有将'visible'设置为'0'

的Array对象

阵列:

{
"Count":5,
"0":{"id":"1","visible":"0"},
"1":{"id":"3","visible":"0"},
"2":{"id":"1","visible":"0"},
"3":{"id":"2","visible":"0"},
"4":{"id":"3","visible":"0"}
}

PHP:

function cleanup($arr) {
    for($i = 0; $i < (count($arr)-1); $i++) {
        if($arr[$i]['visible'] == false) {
            unset($arr[$i]);
        }
    }
    $newarr = array_unique($arr, SORT_REGULAR);
    $newarr['Count'] = count($newarr)-1;

    return $newarr;
}

结果:

{
"Count":2,
"3":{"id":"2","visible":"0"},
"4":{"id":"3","visible":"0"}
}

在我看来,这应该有效并返回{“Count”:0}。另外为什么'键'没有设置为0,1而不是3,4。我哪里错了?

2 个答案:

答案 0 :(得分:2)

你在for循环中使用count($ arr)-1),并且每次迭代都会重新计算,所以在你取消前三次后,我是3,但是count($ arr)-1)是1,然后退出循环。 你应该在for循环之前设置$ j = count($ arr)-1,并使用for($ i = 0; $ i&lt; $ j; $ i ++)

一般来说,在for循环中使用count()等函数是不好的编程习惯(性能方面)

答案 1 :(得分:1)

如果从数值数组的中间删除索引,

unset()将不会重新排序数组索引。您需要自己重新索引数组。 array_values()在这里很有帮助。

function cleanup($arr) {
    for($i = 0; $i < (count($arr)-1); $i++) {
        if($arr[$i]['visible'] == false) {
            unset($arr[$i]);
        }
    }
    $newarr = array_values(array_unique($arr, SORT_REGULAR));
    return $newarr;
}

Count属性对我来说毫无意义,因此我放弃了它。您可以改为使用函数count()