Es passiert mir oft, Daten zu verarbeiten, die entweder ein Array oder eine Nullvariable sein können, und einige foreach
mit diesen Daten zu versorgen.
$values = get_values();
foreach ($values as $value){
...
}
Wenn Sie einen foreach mit Daten füttern, die kein Array sind, erhalten Sie eine Warnung:
Warnung: Ungültiges Argument für foreach () in [...]
Angenommen, es ist nicht möglich, die get_values()
Funktion so umzugestalten , dass immer ein Array zurückgegeben wird (Abwärtskompatibilität, nicht verfügbarer Quellcode, aus welchem anderen Grund auch immer), frage ich mich, welcher Weg am saubersten und effizientesten ist, um diese Warnungen zu vermeiden:
- Casting
$values
zum Array - Initialisierung
$values
auf Array - Wickeln Sie die
foreach
mit einemif
- Andere (bitte vorschlagen)
$values
es sich nicht um ein Array handelt.Antworten:
Persönlich finde ich das am saubersten - ich bin mir nicht sicher, ob es am effizientesten ist!
Der Grund für meine Präferenz ist, dass kein leeres Array zugewiesen wird, wenn Sie sowieso nichts zu Beginn haben.
quelle
count()
ist nicht zuverlässig. Wenn Siecount()
null übergeben, wird 0 zurückgegeben. Wenn Sie ein Nicht-Null-Argument ohne Array übergeben, wird 1 zurückgegeben. Daher kann nichtcount()
bestimmt werden, ob die Variable ein Array ist, wenn die Variable ein leeres Array sein könnte, oder ein Array mit 1 Element.if (is_array($values) || $values instanceof Traversable)
.Wie wäre es mit diesem? viel sauberer und alles in einer Zeile.
quelle
isset()
oderis_array()
oder beides, ganz abhängig von Ihrem Szenario usw.Normalerweise verwende ich ein ähnliches Konstrukt:
Beachten Sie, dass diese bestimmte Version nicht getestet wird, sondern direkt aus dem Speicher in SO eingegeben wird.
Bearbeiten: Traversable Check hinzugefügt
quelle
$var instanceof Traversable
. Siehe hier . Zum Beispiel können Sie jedes SimpleXMLElement foreach , aber es ist keine Instanz von Iterator oder IteratorAggregate.is_object($var)
re hinzuzufügen . php.net/manual/en/language.oop5.iterations.phpIterator
oder nicht besser bedient werden konnteIteratorAggregate
, aber das ist natürlich nur meine Meinung und daher subjektiv (ich benutze niemals öffentliche Felder).Bitte verlassen Sie sich nicht auf das Casting als Lösung , auch wenn andere dies als gültige Option vorschlagen, um einen Fehler zu vermeiden, kann dies zu einem anderen führen.
Beachten Sie: Wenn Sie erwarten, dass eine bestimmte Form von Array zurückgegeben wird, schlägt dies möglicherweise fehl. Dafür sind weitere Prüfungen erforderlich.
Ich habe einen kurzen Test geschrieben, um dieses Problem darzustellen . (Hier ist ein Backup-Test für den Fall, dass die erste Test-URL fehlschlägt.)
Enthalten sind Tests für:
null
,false
,true
, einclass
, einarray
undundefined
.Testen Sie Ihre Eingabe immer, bevor Sie sie in foreach verwenden. Vorschläge:
$array = is_array($var) or is_object($var) ? $var : [] ;
try{}catch(){}
Blöckenarray_key_exists
für einen bestimmten Schlüssel verwenden oder die Tiefe eines Arrays testen (wenn es einer ist!) .quelle
Versuche dies:
;)
quelle
Das Problem ist immer null und Casting ist in der Tat die Reinigungslösung.
quelle
Zunächst muss jede Variable initialisiert werden. Immer.
Casting ist keine Option.
if get_values (); kann eine andere Typvariable zurückgeben, dieser Wert muss natürlich überprüft werden.
quelle
$array = (array)null;
Sie ein leeres Array. Natürlich ist es eine Verschwendung von Speicherzuweisung ;-)Prägnantere Erweiterung des Codes von @ Kris
speziell für die Verwendung von Inside Template Code
quelle
return is_iterable($var) ? $var : array($var);
?Wenn Sie PHP7 verwenden und nur undefinierte Fehler behandeln möchten, ist dies meiner Meinung nach das sauberste
quelle
Dies prüft nicht, ob es sich um ein Array handelt, sondern überspringt die Schleife, wenn die Variable null oder ein leeres Array ist.
quelle
Ich bin nicht sicher, ob dies der Fall ist, aber dieses Problem scheint bei der Migration von WordPress-Sites oder der Migration dynamischer Sites im Allgemeinen mehrmals aufzutreten. Wenn dies der Fall ist, stellen Sie sicher, dass das Hosting, auf das Sie migrieren, dieselbe PHP-Version verwendet, die Ihre alte Site verwendet.
Wenn Sie Ihre Site nicht migrieren und dies nur ein aufgetretenes Problem ist, versuchen Sie, ein Update auf PHP 5 durchzuführen. Dadurch werden einige dieser Probleme behoben. Könnte wie eine dumme Lösung erscheinen, hat aber den Trick für mich getan.
quelle
Ein Ausnahmefall für diesen Hinweis tritt auf, wenn Sie das Array in jeder for-Schleife auf null setzen
quelle
Wie wäre es mit dieser Lösung:
quelle
Warnung ungültiges Argument für
foreach()
Anzeige-Tweets angegeben. geh zu/wp-content/plugins/display-tweets-php
. Fügen Sie dann diesen Code in Zeile 591 ein. Er läuft einwandfrei.quelle
if (is_array($_POST['auto'])){ // code }
Es scheint auch eine Beziehung zur Umwelt zu geben:
Ich hatte diesen Fehler "ungültiges Argument für foreach () angegeben" nur in der Entwicklungsumgebung, aber nicht in prod (ich arbeite auf dem Server, nicht auf localhost).
Trotz des Fehlers zeigte ein var_dump an, dass das Array gut vorhanden war (in beiden Fällen app und dev).
Das
if (is_array($array))
rund umforeach ($array as $subarray)
das Problem gelöst.Es tut mir leid, dass ich die Ursache nicht erklären kann, aber da ich eine Weile gebraucht habe, um eine Lösung zu finden, dachte ich daran, dies besser als Beobachtung zu teilen.
quelle
Verwenden Sie die Funktion is_array, wenn Sie das Array an jede Schleife übergeben.
quelle
Was ist mit der Definition eines leeren Arrays als Fallback, wenn
get_value()
es leer ist?Ich kann mir keinen kürzesten Weg vorstellen.
quelle
Ich werde eine Kombination verwenden
empty
,isset
undis_array
alsquelle
Ich würde das gleiche tun wie Andy, aber ich würde die 'leere' Funktion verwenden.
wie so:
quelle
$yourArray = 1;
es versucht zu iterieren, erhalten Sie den Fehler.empty()
ist kein geeigneter Test.