2010-10-25 29 views
13

¿Cómo puedo comprobar una matriz de forma recursiva para el contenido vacío como en este ejemplo:¿cuál es la mejor manera de verificar una matriz vacía?

Array 
(
    [product_data] => Array 
     (
      [0] => Array 
       (
        [title] => 
        [description] => 
        [price] => 
       ) 

     ) 
    [product_data] => Array 
     (
      [1] => Array 
       (
        [title] => 
        [description] => 
        [price] => 
       ) 

     ) 

) 

La matriz no está vacía, pero no hay contenido. ¿Cómo puedo verificar esto con una función simple?

¡Gracias!

+6

¿Cómo es que la matriz tiene dos llaves idénticas 'product_data'? – codaddict

+0

@codaddict: Buena observación. –

+0

lo siento copié solo el texto, por ejemplo :-) – comod

Respuesta

15

function is_array_empty($InputVariable) 
{ 
    $Result = true; 

    if (is_array($InputVariable) && count($InputVariable) > 0) 
    { 
     foreach ($InputVariable as $Value) 
     { 
     $Result = $Result && is_array_empty($Value); 
     } 
    } 
    else 
    { 
     $Result = empty($InputVariable); 
    } 

    return $Result; 
} 
+0

Una solución más general y tolerante a las fallas que la mía :), pero ¿podría usted no cortocircuitarla y regresar inmediatamente con una respuesta no vacía en lugar de continuar probando el resto de la matriz? –

+2

foreach ($ InputVariable as $ Value) – comod

+0

@David Martensson: La ejecución solo se enrutará a la declaración else si la variable asignada a la función no es una matriz. Piense en la matriz dada en la pregunta como un árbol y en el bloque else como el caso base que todas las hojas serán evaluadas por. – emurano

2

Suponiendo la matriz siempre contener el mismo tipo de datos:

function TestNotEmpty($arr) { 
    foreach($arr as $item) 
     if(isset($item->title) || isset($item->descrtiption || isset($item->price)) 
      return true; 
    return false; 
} 
2

corto circuito incluido.

function hasValues($input, $deepCheck = true) { 
    foreach($input as $value) { 
     if(is_array($value) && $deepCheck) { 
      if($this->hasValues($value, $deepCheck)) 
       return true; 
     } 
     elseif(!empty($value) && !is_array($value)) 
      return true; 
    } 
    return false; 
} 
2

Aquí está mi versión. Una vez que encuentra una cadena no vacía en una matriz, se detiene. Además, comprueba correctamente las cadenas vacías, de modo que un 0 (cero) no se considera una cadena vacía (lo que sería si usara la función vacía()). Por cierto, incluso el uso de esta función solo para cadenas ha demostrado ser invaluable a lo largo de los años.

function isEmpty($stringOrArray) { 
    if(is_array($stringOrArray)) { 
     foreach($stringOrArray as $value) { 
      if(!isEmpty($value)) { 
       return false; 
      } 
     } 
     return true; 
    } 

    return !strlen($stringOrArray); // this properly checks on empty string ('') 
} 
8

Si la matriz es sólo un nivel también se puede hacer:

if (strlen(implode('', $array)) == 0) 

Obras en la mayoría de los casos :)

+0

No lo es. ¿Qué tal una matriz multidimensional? – sonnb

+2

@sonnb: Debe leer con cuidado: ¡un nivel! = Multidimensional/multinivel. – velop

0

Si alguien tropieza con esta pregunta y es necesario comprobar si la totalidad array es NULL, lo que significa que cada par en la matriz es igual a null, esta es una función práctica. Podrías modificarlo muy fácilmente para que sea verdadero si alguna variable también devuelve NULL. Necesitaba esto para un determinado formulario web en el que actualizaba los datos de los usuarios y era posible que quedara completamente en blanco, por lo que no era necesario hacer ningún SQL.

$test_ary = array("1"=>NULL, "2"=>NULL, "3"=>NULL); 

function array_empty($ary, $full_null=false){ 
    $null_count = 0; 
    $ary_count = count($ary); 

    foreach($ary as $value){ 
     if($value == NULL){ 
      $null_count++; 
     } 
    } 

    if($full_null == true){ 
     if($null_count == $ary_count){ 
      return true; 
     }else{ 
      return false; 
     } 
    }else{ 
     if($null_count > 0){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 

$test = array_empty($test_ary, $full_null=true); 
echo $test; 
7

solución con array_walk_recursive:

function empty_recursive($value) 
{ 
     if (is_array($value)) { 
       $empty = TRUE; 
       array_walk_recursive($value, function($item) use (&$empty) { 
         $empty = $empty && empty($item); 
       }); 
     } else { 
       $empty = empty($value); 
     } 
     return $empty; 
} 
+0

Configuración más elegante entre las respuestas. – chikamichi

0
$arr=array_unique(array_values($args)); 
if(empty($arr[0]) && count($arr)==1){ 
echo "empty array"; 
} 
0

devoluciones TRUE si se aprueba una variable que no sea una matriz, o si alguna de las matrices anidadas contiene un valor (incluidos los valores Falsy!). Devuelve FALSE de lo contrario. Cortocircuitos.

function has_values($var) { 
    if (is_array($var)) { 
    if (empty($var)) return FALSE; 
    foreach ($var as $val) { 
     if(has_values($val)) return TRUE; 
    } 
    return FALSE; 
    } 
    return TRUE; 
} 
0

He aquí una buena función de utilidad que volverá true (1) si la matriz está vacía, o false (0) si no:

function is_array_empty($mixed) { 
    if (is_array($mixed)) { 
     foreach ($mixed as $value) { 
      if (! is_array_empty($value)) { 
       return false; 
      } 
     } 
    } elseif (! empty($mixed)) { 
     return false; 
    } 

    return true; 
} 

Por ejemplo, dada una matriz multidimensional:

$products = array(
    'product_data' => array(
     0 => array(
      'title' => '', 
      'description' => null, 
      'price' => '', 
     ), 
    ), 
); 

Usted Obtendrá un valor true devuelto por is_array_empty(), ya que no hay valores establecidos:

var_dump(is_array_empty($products)); 

Ver este código de forma interactiva en: http://codepad.org/l2C0Efab

Cuestiones relacionadas