2010-10-25 4 views
13

Comment puis-je vérifier un tableau récursive pour le contenu vide comme dans cet exemple:meilleur moyen de vérifier un tableau vide?

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

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

     ) 

) 

Le tableau n'est pas vide, mais il n'y a pas de contenu. Comment puis-je vérifier cela avec une fonction simple?

Merci !!

+6

Comment se fait votre tableau a deux clés identiques 'de product_data'? – codaddict

+0

@codaddict: Bonne observation. –

+0

désolé j'ai copié seulement le texte par exemple :-) – comod

Répondre

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

Une solution plus générale et tolérante aux pannes que la mienne :), mais pourriez-vous la court-circuiter et revenir immédiatement sur une réponse non vide au lieu de continuer à tester le reste du tableau? –

+2

foreach ($ InputVariable as $ Value) – comod

+0

@David Martensson: L'exécution ne sera routée que vers l'instruction else si la variable donnée à la fonction n'est pas un tableau. Pensez au tableau donné dans la question comme un arbre et le bloc d'autre comme le cas de base que toutes les feuilles seront évaluées par. – emurano

2

En supposant que le tableau contiendra toujours le même type de données:

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

Un court-circuit inclus.

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

Voici ma version. Une fois qu'il trouve une chaîne non vide dans un tableau, il s'arrête. De plus, il vérifie correctement les chaînes vides, de sorte qu'un 0 (zéro) n'est pas considéré comme une chaîne vide (ce qui serait le cas si vous utilisiez la fonction empty()). En passant, même en utilisant cette fonction uniquement pour les cordes s'est avérée inestimable au fil des ans.

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 votre tableau est qu'un seul niveau, vous pouvez également faire:

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

Works dans la plupart des cas :)

+0

Il ne l'est pas. Qu'en est-il du tableau multidimensionnel? – sonnb

+2

@sonnb: Vous devez lire attentivement: Un niveau! = Niveau multi-dimensionnel/multi. – velop

0

Si quelqu'un trébuche sur cette question et doit vérifier si l'ensemble array est NULL, ce qui signifie que chaque paire dans le tableau est égale à null, c'est une fonction pratique. Vous pouvez très facilement le modifier pour renvoyer true si une variable renvoie aussi NULL. J'en avais besoin pour un certain formulaire Web où il mettait à jour les données des utilisateurs et il était possible qu'il soit complètement vide, donc pas besoin de faire de 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

Solution avec 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

Configuration la plus élégante parmi les réponses. – chikamichi

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

Retours TRUE si elle est adoptée une autre variable d'un tableau, ou si l'un des tableaux imbriqués contient une valeur (y compris les valeurs falsy!). Renvoie FALSE sinon. Courts-circuits.

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

est ici une bonne fonction d'utilité qui renverra true (1) si le tableau est vide, ou false (0) sinon:

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

Par exemple, étant donné un tableau multidimensionnel:

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

Vous obtiendra une true valeur retournée de is_array_empty(), car il n'y a pas de valeurs définies:

var_dump(is_array_empty($products)); 

Voir ce code de manière interactive à: http://codepad.org/l2C0Efab

Questions connexes