2011-04-21 21 views
10

¿Cómo puedo bucle a través de esta matriz y eliminar cualquier valores vacíos:PHP matriz - Extracción de valores vacíos

[28] => Array 
    (
     [Ivory] => 
     [White] => 
    ) 

[29] => Array 
    (
     [Ivory] => 
     [White] => 
    ) 

[30] => Array 
    (
     [Ivory] => 
     [White] => 36 
    ) 

[31] => Array 
    (
     [White] => 24 
    ) 

lo tanto, decir que sería eliminar 28, 29 y acaba de Marfil desde el 30 ...

¡Gracias!

Respuesta

4

creo que esto va a hacer lo que estás buscando:

foreach($array as $key => $value) { 
    if(is_array($value)) { 
     foreach($value as $key2 => $value2) { 
      if(empty($value2)) 
       unset($array[ $key ][ $key2 ]); 
     } 
    } 
    if(empty($array[ $key ])) 
     unset($array[ $key ]); 
} 

se hará en bucle a través de la matriz externa, descender a las matrices que contiene y eliminar las claves cuyos valores están vacíos. Luego, una vez hecho esto, eliminará todas las claves de la matriz externa cuyos subvalores estaban todos vacíos.

Tenga en cuenta que no funcionaría para una matriz genérica , solo la que proporcionó (bidimensional).

+0

Ah, magia ... Gracias Ryan :) –

-1

Probablemente necesite editar el código de abajo un poco.

foreach ($arr as $key => $value) { 
    if($value == "") { 
    unset($value[$key]); 
    } 
} 
+0

Hmm, parece que no funciona ... Puse un dado; en la declaración if, pero parece que no muere - I.E. no está siendo emparejado –

+0

esto no funcionará, porque '$ value' va a ser una matriz; él quiere eliminar las llaves vacías cuyos valores están vacíos desde la matriz interna y externa – Ryan

+0

Sí, era un ejemplo de código corto para mostrar el bucle, verificar y desarmar. Estaba trabajando en el código funcional, pero publicaste la solución antes de terminar. –

1

Otra forma, utilizando preg_grep:

foreach($array as $key => $subarray) { 
    $array[$key] = preg_grep('/^$/', $subarray, PREG_GREP_INVERT); 
} 

Actualización: olvidaron de la eliminación de las matrices vacías. La técnica que se muestra en @Ryan's answer también se puede aplicar aquí.

+0

bueno, nunca he usado preg_grep. Sin embargo, no creo que esto elimine los índices 28 y 29 del conjunto. – Ryan

+0

@Ryan: Cierto, de alguna manera me olvidé de esto;) Pero ya me has dado una buena respuesta sobre cómo hacerlo ... –

37

Veo que ya tiene una solución de trabajo, pero sólo por diversión, con la bondad array_map:

$array = array_filter(array_map('array_filter', $array)); 
+1

¡No, esto es mágico! –

+7

magia negra de hecho! Debo señalar, sin embargo, que esto solo funcionará para las matrices anidadas. las matrices de reg solo necesitan array_filter() sin la devolución de llamada. –

+2

Esto funciona porque "Si no se proporciona una devolución de llamada (a array_filter), se eliminarán todas las entradas de la matriz igual a FALSE" (del manual). Además, lo que dijo @MattK. –

0
//Check Array Remove Empty Key 
$ixx=0; $ix=0;//Set Array First. 
while(end(array_keys($a1))>=$ix){ //Check Last Key in Array 
if($a1[$ix]!=""){ //Check Empty Key 
    $ax[$ixx]=$a1[$ix];$ixx++; } //Remove Empty Key 
$ix++; 
} 
//End Check Array Remove Empty Key 

print_r($ax);//Print Array After remove Empty Key 
+0

Esto realmente no aborda la pregunta, que se trata de una matriz anidada (una matriz de matrices). – femtoRgon

0

Para cualquiera que esté buscando para la limpieza de una variable que es una simple matriz o una matriz multidimensional (matriz anidada con profundidad desconocida) aquí está mi solución propuesta: (se crea como una función estática en una clase, pero puede trabajar también fuera de una clase -> acaba de quitar uno mismo: :)

public static function clean($Array, $Strict=true) 
    { 
     if(! is_array($Array)) 
     { 
      return $Array; 
     } 
     $cleaned = array(); 

     foreach ($Array as $key => $value) 
     { 
      if($Strict) 
      { 
       if(!empty($value)) 
       { 
        $tmp = self::clean($value,$Strict); 
        if(!empty($tmp)) 
        { 
         $cleaned[$key] = $tmp; 
        } 
       } 
      }//strict 
      else 
      { 
       if(is_array($value)) 
       { 
        if(!empty($value)) 
        { 
         $tmp = self::clean($value,$Strict); 
         if(!empty($tmp)) 
         { 
          $cleaned[$key] = $tmp; 
         } 
        } 
       } 
       elseif(strlen($value) > 0) 
       { 
        $tmp = self::clean($value,$Strict); 
        if(strlen($tmp) > 0) 
        { 
         $cleaned[$key] = $tmp; 
        } 
       } 
      }//not strict 
     } //end foreach 

     return $cleaned; 
    } 

Espero que alguien ahorre tiempo :) Salud

Cuestiones relacionadas