2011-10-08 15 views
8

Potrzebuję usunąć puste wpisy na wielopoziomowych tablicach. Na razie mogę usunąć wpisy z pustymi sub-macierzy, ale nie jest pusta tablice ... mylić, więc mogę ... Myślę, że kod pomogą wyjaśnić lepiej ...PHP - Jak usunąć rekursywnie puste wpisy tablicy?

<?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)); 

?> 

Ok, ten kod usunie "pseudonim", "datę urodzenia", ale nie usuwa "rowerów", które mają pustą tablicę.

Moje pytanie brzmi ... Jak usunąć wpis "rowery"?

Pozdrawiam,

Przepraszam za mój angielski ...

+0

Dlaczego chcesz je usunąć? – John

Odpowiedz

24

wypróbować ten kod:

<?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

Świetnie, działa! Dzięki za pomoc. –

+2

Dzięki, po prostu go użyłem. Jedno dodanie: jeśli chcesz usunąć ciągi znaków "whitespaced" również w wartościach tablicowych, dodaj jedną małą klauzulę "elseif": if (is_array (wartość $)) { $ haystack [$ key] = array_remove_empty ($ haystack [$ klawisz]); } elseif (is_string ($ haystack [$ key])) { $ haystack [$ key] = przycinanie (wartość $); } W ten sposób tablica (tablica ("", "')) zostanie zwrócona jako pusta. –

+0

Zawsze używaj \ _ \ _ FUNCTION__ w wywołaniach rekurencyjnych, aby Twoja funkcja była przenośna. –

-2

Jeśli chcesz array_filter działać rekurencyjnie, musisz upewnić się, że kolejne wywołania mogą edytować głębiej zagnieżdżone elementy tablicy. Skrót: musisz podać go w postaci:

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

    return !!$item; 
} 
1

Myślę, że powinno to rozwiązać twój problem.

$retArray =array_filter($array, arrayFilter); 

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

Oto moje rozwiązanie, usuwa dokładnie określonej listy pustych wartości rekurencyjnie:

/** 
* 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; 
} 

można go używać tak:

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

Uwaga, usuwa pusty sub Jeśli podasz [] jako jedną z wartości.

Powiązane problemy