Il m'arrive souvent de gérer des données qui peuvent être un tableau ou une variable nulle et d'en nourrir certaines foreach
avec ces données.
$values = get_values();
foreach ($values as $value){
...
}
Lorsque vous alimentez un foreach avec des données qui ne sont pas un tableau, vous obtenez un avertissement:
Avertissement: Argument non valide fourni pour foreach () dans [...]
En supposant qu'il n'est pas possible de refactoriser la get_values()
fonction pour toujours renvoyer un tableau (compatibilité descendante, code source non disponible, quelle que soit la raison), je me demande quelle est la manière la plus propre et la plus efficace d'éviter ces avertissements:
- Casting
$values
dans un tableau - Initialisation
$values
au tableau - Envelopper le
foreach
avec unif
- Autre (veuillez suggérer)
$values
ne soit pas un tableau.Réponses:
Personnellement, je trouve que c'est le plus propre - je ne sais pas si c'est le plus efficace, l'esprit!
La raison de ma préférence est qu'il n'alloue pas de tableau vide quand vous n'avez rien pour commencer de toute façon.
la source
count()
n'est pas fiable. Si vous passezcount()
null, il renvoie 0. Si vous lui passez un argument non null et non tableau, il renvoie 1. Par conséquent, il est impossible d'utilisercount()
pour déterminer si la variable est un tableau alors que la variable peut être un tableau vide, ou un tableau contenant 1 élément.if (is_array($values) || $values instanceof Traversable)
.Celui-ci, ça va? beaucoup plus propre et tout en une seule ligne.
la source
isset()
ou lesis_array()
deux, entièrement en fonction de votre scénario, etc.J'utilise généralement une construction similaire à celle-ci:
Notez que cette version particulière n'est pas testée, elle est tapée directement dans SO depuis la mémoire.
Edit: ajout de la vérification Traversable
la source
$var instanceof Traversable
. Voyez ici . Parce que, par exemple, vous pouvez foreach un SimpleXMLElement , mais ce n'est pas une instance de Iterator ou IteratorAggregate.is_object($var)
re. php.net/manual/en/language.oop5.iterations.phpIterator
ouIteratorAggregate
, mais c'est bien sûr juste mon opinion et donc subjective (je n'utilise jamais les champs publics).Veuillez ne pas dépendre de la diffusion comme solution , même si d'autres suggèrent cela comme une option valide pour éviter une erreur, cela pourrait en provoquer une autre.
Attention: Si vous vous attendez à ce qu'une forme spécifique de tableau soit renvoyée, cela peut vous échouer. Plus de contrôles sont nécessaires pour cela.
J'ai écrit un test rapide pour présenter ce problème . (Voici un test de sauvegarde au cas où la première URL de test échouerait.)
Inclus sont des tests pour:
null
,false
,true
, unclass
, unarray
etundefined
.Testez toujours votre entrée avant de l'utiliser dans foreach. Suggestions:
$array = is_array($var) or is_object($var) ? $var : [] ;
try{}catch(){}
blocsarray_key_exists
une clé spécifique ou tester la profondeur d'un tableau (quand il en est un!) .la source
Essaye ça:
;)
la source
Le problème est toujours nul et Casting est en fait la solution de nettoyage.
la source
Tout d'abord, chaque variable doit être initialisée. Toujours.
Le casting n'est pas une option.
if get_values (); peut renvoyer une variable de type différent, cette valeur doit être vérifiée, bien sûr.
la source
$array = (array)null;
vous obtenez un tableau vide. Bien sûr, c'est un gaspillage d'allocation de mémoire ;-)Extension plus concise du code de @ Kris
en particulier pour utiliser le code du modèle à l'intérieur
la source
return is_iterable($var) ? $var : array($var);
?Si vous utilisez php7 et que vous souhaitez gérer uniquement les erreurs non définies, c'est le IMHO le plus propre
la source
Cela ne vérifie pas s'il s'agit d'un tableau, mais ignore la boucle si la variable est nulle ou un tableau vide.
la source
Je ne sais pas si c'est le cas, mais ce problème semble se produire plusieurs fois lors de la migration de sites wordpress ou de la migration de sites dynamiques en général. Si tel est le cas, assurez-vous que l'hébergement vers lequel vous migrez utilise la même version PHP que votre ancien site utilise.
Si vous ne migrez pas votre site et que c'est juste un problème qui s'est posé, essayez de mettre à jour vers PHP 5. Cela résout certains de ces problèmes. Cela peut sembler une solution idiote mais a fait l'affaire pour moi.
la source
Un cas exceptionnel pour cet avis se produit si vous définissez le tableau sur null dans la boucle foreach
la source
Que diriez-vous de cette solution:
la source
Avertissement argument non valide fourni pour l'
foreach()
affichage des tweets. aller à/wp-content/plugins/display-tweets-php
. Insérez ensuite ce code sur la ligne numéro 591, il fonctionnera parfaitement.la source
if (is_array($_POST['auto'])){ // code }
Il semble également y avoir une relation avec l'environnement:
J'ai eu cette erreur "argument non valide fourni poureach ()" uniquement dans l'environnement de développement, mais pas dans prod (je travaille sur le serveur, pas sur localhost).
Malgré l'erreur, un var_dump a indiqué que le tableau était bien là (dans les deux cas, app et dev).
Le
if (is_array($array))
tour du aforeach ($array as $subarray)
résolu le problème.Désolé, je ne peux pas expliquer la cause, mais comme il m'a fallu un certain temps pour trouver une solution, j'ai pensé à mieux partager cela comme une observation.
la source
Utilisez la fonction is_array, lorsque vous passerez un tableau à une boucle foreach.
la source
Qu'en est-il de la définition d'un tableau vide comme repli s'il
get_value()
est vide?Je ne peux pas penser à un moyen le plus court.
la source
Je vais utiliser une combinaison de
empty
,isset
etis_array
commela source
je ferais la même chose qu'Andy mais j'utiliserais la fonction 'vide'.
ainsi:
la source
$yourArray = 1;
essaie d'itérer, et vous obtiendrez l'erreur.empty()
n'est pas un test approprié.