2011-10-08 33 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, []]); 

注意,它消除了空分數組,如果你通過[]作爲值之一。