2011-10-08 32 views
8

我需要删除多级阵列上的空条目。现在我可以用空的子阵中删除条目,而不是空数组...困惑,所以我...我认为的代码将有助于更好地解释......PHP的 - 如何递归删除数组的空条目?

<?php 

/** 
* 
* This function remove empty entries on arrays 
* @param array $array 
*/ 
function removeEmptysFromArray($array) { 

    $filtered = array_filter($array, 'removeEmptyItems'); 
    return $filtered; 
} 

/** 
* 
* This is a Callback function to use in array_filter() 
* @param array $item 
*/ 
function removeEmptyItems($item) { 

    if (is_array($item)) { 
     return array_filter($item, 'removeEmptyItems'); 
    } 

    if (!empty($item)) { 
     return true; 
    } 
} 


$raw = array(
    'firstname' => 'Foo', 
    'lastname' => 'Bar', 
    'nickname' => '', 
    'birthdate' => array( 
     'day' => '', 
     'month' => '', 
     'year' => '', 
    ), 
    'likes' => array(
     'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 
     'bikes' => array(), 
    ), 
); 

print_r(removeEmptysFromArray($raw)); 

?> 

好吧,这个代码将删除“昵称”,“生日”,但不会删除具有空阵列的“自行车”。

我的问题是...如何删除“自行车”条目?

最好的问候,

对不起,我的英语...

+0

你为什么要删除它们? – John

回答

24

试试这个代码:如果你想array_filter递归工作

<?php 
function array_remove_empty($haystack) 
{ 
    foreach ($haystack as $key => $value) { 
     if (is_array($value)) { 
      $haystack[$key] = array_remove_empty($haystack[$key]); 
     } 

     if (empty($haystack[$key])) { 
      unset($haystack[$key]); 
     } 
    } 

    return $haystack; 
} 

$raw = array(
    'firstname' => 'Foo', 
    'lastname' => 'Bar', 
    'nickname' => '', 
    'birthdate' => array(
     'day' => '', 
     'month' => '', 
     'year' => '', 
    ), 
    'likes' => array(
     'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 
     'bikes' => array(), 
    ), 
); 

print_r(array_remove_empty($raw)); 
+0

太棒了,它工作!谢谢您的帮助。 –

+2

谢谢,刚刚使用它。一个补充:如果你想删除数组值中的“空格”字符串,那么添加一个“elseif”子句:if(is_array($ value)){$ haystack [$ key] = array_remove_empty($ haystack [$键]); {$ key} = trim($ value);} {haystack [$ key] = trim($ value);}} elseif(is_string($ haystack [$ key])){ } }这样array(array(“”,''))也会返回为空。 –

+0

在递归调用中始终使用\ _ \ _ FUNCTION__以使您的函数具有可移植性。 –

-2

,你需要确保的是,随后的调用可能会编辑数组的更深嵌套项目。短:您需要通过参考:

function removeEmptyItems(&$item) { 
    if (is_array($item) && $item) { 
     $item = array_filter(&$item, 'removeEmptyItems'); 
    } 

    return !!$item; 
} 
1

我认为这应该可以解决您的问题。

$retArray =array_filter($array, arrayFilter); 

function arrayFilter($array) { 
    if(!empty($array)) { 
     return array_filter($array); 
    } 
} 
0

这里是我的解决方案,它会删除递归空值的确切定义的列表:

/** 
* Remove elements from array by exact values list recursively 
* 
* @param array $haystack 
* @param array $values 
* 
* @return array 
*/ 
function array_remove_by_values(array $haystack, array $values) 
{ 
    foreach ($haystack as $key => $value) { 
     if (is_array($value)) { 
      $haystack[$key] = array_remove_by_values($haystack[$key], $values); 
     } 

     if (in_array($haystack[$key], $values, true)) { 
      unset($haystack[$key]); 
     } 
    } 

    return $haystack; 
} 

您可以使用它像这样:

$clean = array_remove_by_values($raw, ['', null, []]); 

注意,它消除了空分数组,如果你通过[]作为值之一。