2011-10-08 17 views
8

Necesito eliminar entradas vacías en matrices multinivel. Por ahora puedo eliminar entradas con vacíos sub-arrays, pero no las matrices vacías ... confuso, por lo que puedo ... Creo que el código le ayudará a explicar mejor ...PHP - ¿Cómo eliminar las entradas vacías de una matriz recursivamente?

<?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, este código eliminará "apodo", "fecha de nacimiento", pero no eliminará "bicicletas" que tengan una matriz vacía.

Mi pregunta es ... ¿Cómo eliminar la entrada "bicis"?

Best Regards,

Lo siento por mi Inglés ...

+0

¿Por qué quieres eliminarlos? – John

Respuesta

24

probar este código:

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

¡Estupendo, está funcionando! Gracias por la ayuda. –

+2

Gracias, acaba de usarlo. Una adición: si también desea eliminar cadenas "espaciadas en blanco" en valores de matriz, agregue una pequeña cláusula "elseif": if (is_array ($ value)) { $ haystack [$ key] = array_remove_empty ($ haystack [$ llave]); } elseif (is_string ($ haystack [$ key])) { $ haystack [$ key] = recorte ($ valor); } that way array (array ("", '')) también se devolverá como vacío. –

+0

Siempre use \ _ \ _ FUNCTION__ en llamadas recursivas para hacer que su función sea portátil. –

-2

Si desea array_filter a trabajar de forma recursiva, que necesita para asegurarse de que el las llamadas subsiguientes pueden editar los elementos anidados más profundos de la matriz. Corto: deberá pasarlo por referencia:

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

    return !!$item; 
} 
1

Creo que esto debería resolver su problema.

$retArray =array_filter($array, arrayFilter); 

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

Aquí está mi solución, se eliminará la lista exactamente especificado de valores vacíos de forma recursiva:

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

Usted puede utilizar de esta manera:

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

Nota, se elimina sub vacía matrices si pasa [] como uno de los valores.

Cuestiones relacionadas