在数组上使用unset(),但它保留了值

时间:2015-07-12 22:47:28

标签: php arrays ajax unset

如果他的某个属性为null或为空,我试图从数组中删除一个对象,这就是代码。

使用此函数对数组进行了排序:

function sortArray($c1, $c2)
{
    return ($c1->propertyToCheck < $c2->propertyToCheck);
}

如果它改变了什么。

$myArray = array();
...
// Add values to the array here
...
usort($myArray,"sortArray");

for($i = 0; $i < count($myArray ); $i++)
{
    if(empty($myArray[$i]->propertyToCheck))
    {
        unset($myArray[$i]);

        // var_dump($myArray[$i]) returns NULL
    }
}

echo json_encode($myArray); 
// Returns the entire array, even with the values that shouldn't be there.

代码在函数内部,但是在所述函数内部创建了数组。

我使用echo json_encode($ myArray)将值发送回AJAX,但发送的数组是包含其中每个对象的整个数组。

1 个答案:

答案 0 :(得分:3)

count($myArray)是“问题” 一旦unset()被“到达”,则数组中有一个元素较少,因此对count($myArray)的下一次调用将返回前一次迭代的n-1 - &gt;你的循环没有到达数组的末尾 您至少有三个选择(按照我的偏好的升序排列)

A)

$maxIdx = count($myArray);
for($i = 0; $i < $maxIdx; $i++) {

b)中

foreach( $myArray as $key=>$obj ) {
    if(empty($obj->propertyToCheck)) {
        unset($myArray[$key]);

c)中

$myArray = array_filter(
    $myArray,
    function($e) {
        return !empty($e->propertyToCheck); 
    }
);

(......还有更多)

另见:http://docs.php.net/array_filter