409 Stimmen

Ungültiges Argument für foreach() geliefert

Es passiert mir oft, dass ich Daten verarbeiten muss, die entweder ein Array oder eine Null-Variable sein können, und dass ich einige foreach mit diesen Daten.

$values = get_values();

foreach ($values as $value){
  ...
}

Wenn Sie eine foreach mit Daten füttern, die kein Array sind, erhalten Sie eine Warnung:

Warnung: Ungültiges Argument geliefert für foreach() in [...]

Angenommen, es ist nicht möglich, die get_values() Funktion immer ein Array zurückgeben (Abwärtskompatibilität, nicht verfügbarer Quellcode, welcher Grund auch immer), frage ich mich, was der sauberste und effizienteste Weg ist, um diese Warnungen zu vermeiden:

  • Gießen $values zum Array
  • Initialisierung $values zum Array
  • Einpacken der foreach mit einer if
  • Sonstiges (bitte vorschlagen)

8voto

Your Common Sense Punkte 154708

Zunächst einmal muss jede Variable initialisiert werden. Immer.
Casting ist keine Option.
Wenn get_values(); Variablen unterschiedlichen Typs zurückgeben kann, muss dieser Wert natürlich überprüft werden.

6voto

T30 Punkte 10166
foreach ($arr ?: [] as $elem) {
    // Do something
}

Dies prüft nicht, ob es sich um ein Array handelt, sondern überspringt die Schleife, wenn die Variable null oder ein leeres Array ist.

Update von PHP 7.0 sollten Sie die Null-Koaleszenz-Operator :

foreach ($arr ?? [] as $elem) {
    // Do something
}

Dies würde die in dem Kommentar erwähnte Warnung lösen ( aquí eine praktische Tabelle, die Folgendes vergleicht ?: y ?? Ausgänge).

6voto

boctulus Punkte 352
$values = get_values();

foreach ((array) $values as $value){
  ...
}

Das Problem ist immer gleich null, und das Gießen ist in der Tat die Reinigungslösung.

5voto

Edwin Rodríguez Punkte 1180

Wenn Sie php7 verwenden und nur undefinierte Fehler behandeln wollen, ist dies IMHO die sauberste Lösung

$array = [1,2,3,4];
foreach ( $array ?? [] as $item ) {
  echo $item;
}

4voto

TechDingo Punkte 156

Ab PHP >= 7.1.0 verwenden Sie is_iterable

https://www.php.net/manual/en/function.is-iterable.php

if (is_iterable($value)) {
    foreach ($value as $v) {
        ...
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X