2015-07-12 41 views
0

我想从数组中删除一个对象,如果他的某个属性为null或空,这是代码。在数组上使用unset(),但它保留值

的阵列已经使用这个功能来分类:

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,但发送的数组是其中每个对象的整个数组。

+0

我总是困惑,当我看到一个'为()'循环数组,而不是'的foreach()在' – 2015-07-12 22:50:48

+1

PHP保留数字索引,你肯定有前项相同数量和之后? – spenibus

回答

3

count($myArray)是“问题”。
一旦unset()被“达到”,数组中就会少一个元素,因此下一次调用count($myArray)将返回前一次迭代的n-1 - >您的循环不会到达数组的末尾。
你至少有三种选择(在我的偏好依次递增)

一)

$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