2010-08-14 5 views
4

J'ai une boucle foreach, qui va parcourir un tableau, mais le tableau peut ne pas exister en fonction de la logique de cette application particulière.PHP quelle est la meilleure façon de gérer une variable qui ne peut être définie?

Ma question porte sur Je suppose que les meilleures pratiques, par exemple, est-il autorisé à le faire:

if (isset($array)) 
{ 

    foreach($array as $something) 
    { 
     //do something 
    } 
} 

Il me semble en désordre, mais dans ce cas, si je ne fais pas, il erreur sur la pour chaque. devrais-je passer un tableau vide ?? Je n'ai pas publié de code spécifique car c'est une question générale sur le traitement des variables qui peuvent être définies ou non.

+0

Pourquoi $ array ne serait-il pas défini? Pouvez-vous donner un exemple? – strager

Répondre

8

Juste à noter: voici la façon 'la plus sûre'.

if (isset($array) && is_array($array)) { 
    foreach ($array as $item) { 
     // ... 
    } 
} 
+1

C'est une bonne approche. +1 – Stephen

1

Essayez:

if(!empty($array)) 
{ 
    foreach($array as $row) 
    { 
     // do something 
    } 
} 
+1

C'est tout aussi mauvais que 'isset' parce que s'il y a une valeur et que ce n'est pas un tableau, le coede va continuer et peut-être produire des résultats non prévisibles. – prodigitalson

+2

@prodigitalson Je dois dire que si la variable contient éventuellement un tableau, ou éventuellement contient quelque chose d'autre comme une chaîne de caractères, ou n'existe peut-être pas ... vous faites quelque chose de mal. – Stephen

+0

ouais c'est ce que j'ai pensé à propos de isset/vide vous avez vraiment besoin de comprendre leur but précis .. mais aussi, comme vous l'avez dit, la variable pourrait contenir quelque chose de différent. Comment appelez-vous cela lorsque vous vous assurez que les données sont le bon type? Je pensais 'vérification de type' ou quelque chose? quand les gens disent que PHP est un langage typé loosley, est-ce que cela signifie? dans le sens où il vous permettra d'échanger des types de données alors que d'autres langues vous obligent à les déclarer, etc – Tim

0

Ce n'est pas compliqué du tout. En fait, c'est la meilleure pratique. Si je devais signaler quelque chose de compliqué, ce serait l'utilisation du style d'accolade Allman, mais c'est une préférence personnelle. (Je suis une sorte de gars 1TBS);)

Je vais généralement le faire dans toutes mes méthodes de classe:

public function do_stuff ($param = NULL) { 
    if (!empty($param)) { 
     // do stuff 
    } 
} 

Un mot sur vide(). Il y a des cas où isset est préférable, mais vide si la variable n'est pas définie, OU s'il contient une valeur "vide" comme une chaîne vide ou le nombre 0.

+0

ah homme, ne me lancez pas sur le style de renfort, je viens de passer à celui-ci parce que je lis (je pense) les lignes directrices Codeigniter qui l'a recommandé lol – Tim

+0

@ user270797 C'est drôle! Un de mes collègues vient d'écrire quelques appels regex find-and-replace pour analyser tous les fichiers coreigniter core et les convertir en 1TBS car le style allman était si ennuyeux! – Stephen

+0

aucun problème! commentaire supprimé. – Stephen

0

Si vous passez un tableau vide à foreach alors est bien mais si vous passez une variable de tableau qui n'est pas initialisée, cela produira une erreur.

Cela fonctionnera lorsque le tableau est vide ou même pas initialisé.

if(!empty($array) && is_array($array)) { 
    foreach(...) 
} 
+0

Cela générera des avertissements si '$ array' n'est pas vide mais pas un tableau. – NullUserException

+0

@NullUserException: Oui, vous avez raison, mais je pensais que lorsque vous utilisez une variable nommée "tableau", il peut s'agir d'un tableau ou vous avez oublié de vous initialiser en fonction de la question. Quoi qu'il en soit ** is_array ** la condition est correcte pour cela. – NAVEED

+1

Rien ne m'empêche de dire '$ array = null', n'est-ce pas? – NullUserException

-1

Je dirais qu'il est bon d'avoir une autre valeur « booléenne » qui est défini comme 0 (PHP est faux) pour commencer, et tout le temps une fonction ajoute à ce tableau, ajoute +1 à la valeur booléenne , donc vous aurez un moyen précis de savoir si vous devriez jouer avec le tableau ou non? C'est l'approche que je prendrais dans un langage orienté objet, en PHP ça pourrait être plus compliqué, mais je trouve quand même préférable d'avoir une variable délibérée en train de suivre, plutôt que d'essayer d'analyser le tableau lui-même. Idéalement, si cette variable est toujours un tableau, définissez la première valeur sur 0 et utilisez-la comme indicateur:

<?PHP 
//somewhere in initialization 
$myArray[0] = 0; 
... 
//somewhere inside an if statement that fills up the array 
$myArray[0]++; 
$myArray[1] = someValue; 

//somewhere later in the game: 
if($myArray[0] > 0){   //check if this array should be processed or not 
     foreach($myArray as $row){  //start up the for loop 
      if(! $skippedFirstRow){ //$skippedFirstRow will be false the first try 
       $skippedFirstRow++; //now $skippedFirstRow will be true 
       continue;   //this will skip to the next iteration of the loop 
      } 
      //process remaining rows - nothing will happen here for that first placeholder row 
     } 
} 
?> 
+0

Juste une note - vous devriez essayer d'éviter de faire cela, la méthode ci-dessus est un dernier recours, car il est définitivement encore en désordre. –

+0

Il demande quelle est la meilleure pratique pour vérifier si une variable est un tableau. Je ne suis pas sûr dans quel scénario votre code a du sens. 0 n'est pas le faux de PHP: false (ou FALSE) est faux de PHP, et pourquoi voudriez-vous jamais placer le premier élément dans un tableau autrement normal à faux? Qu'est-ce que ce code essaie d'accomplir? –

+0

ok, un peu rouillé sur PHP vrai/faux, peu importe ce qui fonctionne toujours. Si vous lisez à nouveau la question, il parle d'un tableau qui peut exister ou non, et en utilisant l'existence de ce tableau pour une décision logique. Je dirais que pour tout code majeur, ce n'est pas une bonne pratique d'utiliser l'existence du tableau pour la logique du programme dans tous les cas, et vous devriez faire une variable pour le suivre à la place. Dans ce cas, j'ai choisi de stocker le vrai/faux en tant que 1/0 dans le tableau lui-même. Relisez le code à nouveau, vous devriez être en mesure de comprendre comment cela fonctionne, j'ai commenté minutieusement. –

Questions connexes