sauberste Weg, um ein foreach zu überspringen, wenn das Array leer ist [duplicate]
Lesezeit: 7 Minuten
Kein großes Problem, aber ich habe mich gefragt, ob es einen saubereren Weg gibt, dies zu tun. Es wäre gut zu vermeiden, meinen Code mit einer unnötigen if-Anweisung zu verschachteln. Wenn $items ist leer php wirft einen Fehler.
$items = array('a','b','c');
if(!empty($items)) { // <-Remove this if statement
foreach($items as $item) {
print $item;
}
}
Ich könnte wahrscheinlich einfach den ‘@’-Fehlerunterdrücker verwenden, aber das wäre ein bisschen hacky.
Was? Wenn Sie die einfach auskommentieren if Sie haben dort, und ändern Sie die erste Zeile in $items = array();, es funktioniert einwandfrei und arbeitet logisch. Zu deiner Frage muss noch mehr sein. Ist $items vielleicht kein Array?
– Nachzügler
10. August 2010 um 6:26 Uhr
Ich denke, es ist im Fall der Rückkehr von der Funktion, die auch falsch zurückgeben kann. Ich habe auch ein ähnliches Problem und überprüfe immer mit is_array
+1 für Nachzügler. Wenn $items wirklich ein Array ist, gibt PHP keinen Fehler oder keine Warnung aus. Überprüfen Sie Ihre if/else-Zweige und stellen Sie sicher, dass Sie die Variable als Array initialisiert haben.
– csonuryilmaz
25. Februar 2013 um 4:05 Uhr
Sie können diese Situation bei Daten finden, die von einer nicht vertrauenswürdigen Funktion stammen. In diesem Fall ist ein if nicht unnötig und kann sogar besser/sauberer sein als einige andere Lösungen, die kryptischer und schwerer zu lesen sein könnten.
– Alejandro Moreno
6. Oktober 2014 um 15:49 Uhr
Christian
Es gibt eine Million Möglichkeiten, dies zu tun.
Der erste wäre, das Array trotzdem durch foreach laufen zu lassen, vorausgesetzt, Sie haben ein Array.
In anderen Fällen benötigen Sie möglicherweise Folgendes:
foreach ((array) $items as $item) {
print $item;
}
Notiz: An alle Leute, die sich über Typecast beschweren, beachten Sie bitte, dass das OP gefragt hat sauberste Weg, um ein foreach zu überspringen, wenn Array ist leer (Hervorhebung von mir). Ein Wert von wahr, falsch, Zahlen oder Zeichenfolgen ist nicht als leer betrachtet. Darüber hinaus würde dies mit der Implementierung von Objekten funktionieren \Traversablewohingegen is_array würde nicht funktionieren.
Genau das, was ich wollte. Wenn die Variable kein Array ist, wird die Schleife nicht ausgeführt. Vielen Dank.
– Benbob
13. August 2010 um 3:53 Uhr
@ Keyo würde es. und es wird ein Fehler ausgegeben, wenn $items undefiniert ist
– Ihr gesunder Menschenverstand
3. Oktober 2011 um 11:51 Uhr
@Keyo hat eine Bearbeitung vorgenommen und beschrieben, was YCS bedeutet. Mach es einfach nicht generell 😉
– Nico Gawenda
4. Juli 2013 um 3:32 Uhr
Beachten Sie, wenn $items falsch ist. (Array) $items wird ein Array (false)
– Benutzer890973
25. Juli 2013 um 6:29 Uhr
Ich habe keine Fehlermeldung erhalten, wenn $items nicht definiert ist. Gilt das nur für die alte Version? Vielleicht haben sich neue PHP-Versionen um diese Situation gekümmert?
– Binod Kalathil
11. April 2014 um 14:48 Uhr
Ihr gesunder Menschenverstand
Der beste Weg ist Initialisieren Sie jede verdammte Variable vor Gebrauch.
Es wird nicht nur dieses dumme “Problem” lösen, sondern Ihnen auch eine Menge Geld sparen real Kopfschmerzen.
Also, Einführung von $items als $items = array(); ist was du Ja wirklich gesucht.
Nicht bei der Initialisierung von einer Funktion/Methode. $items = get_stuff(). Es ist einfacher, nur zu casten und falsche Variablen geben ein leeres Array zurück.
– Benbob
4. Oktober 2011 um 22:41 Uhr
get_stuff() kann von einer externen API stammen. Es ist nicht ungewöhnlich, dass Bibliotheksfunktionen zurückkehren Array|NULL
– Frédéric Bolduc
9. April 2016 um 17:40 Uhr
Sogar php-eigene Funktionen geben unterschiedliche Typen zurück. Angenommen, Sie fordern ein JSON-Array über das Netzwerk an. Sie wissen, dass das erzeugte JSON immer ein Array ist. Also gibt json_decode() immer ein Array zurück? Nein. Es kann zu einem Netzwerk-Timeout kommen, das empfangene JSON ist unvollständig und json_decode gibt NULL zurück. Dies ist nicht erfunden, sondern ein reales Beispiel aus einem kürzlich aufgetretenen Fehler in Piwik, einem beliebten Analyseskript: github.com/piwik/piwik/pull/11098 Aus Ihrer Antwort wäre die Lösung gewesen, json_decode () von php zu ändern?
– Christoph K.
17. Januar 2017 um 13:57 Uhr
@YourCommonSense Wo wird Ihre Antwort validiert? Validieren würde zB bedeuten, zu prüfen, ob das, was json_decode() zurückgibt, ein Array ist, was genau die Antwort von Matt Williamson sagt.
– Christoph K.
17. Januar 2017 um 14:13 Uhr
@YourCommonSense Die von dir beschriebene Lösung ist natürlich richtig. Aber Ihre ursprüngliche Antwort erwähnt das nicht und wie die Eingabe validiert wird. Es könnte sogar einige Leute zu falschen Annahmen verleiten, wie zum Beispiel zu denken, dass dies sicher ist, nur weil die Initialisierung verwendet wurde: $items=array(); $items=json_decode($str); foreach($items als $item)…
Dadurch werden keine Zeilen entfernt, aber der Code ist viel selbstdokumentierender und einfacher zu lesen.
– Peter Ajtai
10. August 2010 um 7:29 Uhr
+1 auf diese Weise, wenn $items ein Array ist, aber leer ist, wird foreach nicht ausgeführt und es wird kein Fehler auftreten. aber empty() garantiert nicht, ob $items ein Array ist, also ist ein Fehler möglich
– Sergej Eremin
10. August 2010 um 8:49 Uhr
Wenn variabel sein könnte boolean false – z.B. wenn keine Datensätze von der Datenbank zurückgegeben werden oder array – wenn Datensätze zurückgegeben werdenkönnen Sie Folgendes tun:
foreach (($result ? $result : array()) as $item)
echo $item;
Annäherung mit Besetzung ((Array)$result) erzeugt ein Array mit der Anzahl 1, wenn die Variable ist boolean false was du wahrscheinlich nicht willst.
Zach Rattner
Ich würde nicht empfehlen, die Warnausgabe zu unterdrücken. Ich würde jedoch die Verwendung empfehlen is_array Anstatt von !empty. Wenn $items zufällig ein Skalar ungleich Null ist, dann ist die foreach wird immer noch ein Fehler ausgegeben, wenn Sie verwenden !empty.
+1 Unterdrückung von Warnungen und Fehlern ist noch nie eine gute Idee.
– Christian
10. August 2010 um 7:16 Uhr
Ich habe das is_[array] Funktion, das klingt immer noch nach einer schlechten Programmierung. Lassen Sie mich erklären, warum: Warum fragen Sie, ob eine Variable ein Array ist? Sie sollten wissen, dass dies ein Array ist, sonst bedeutet dies, dass Sie mit dem Typ der Variablen herumspielen. Wenn Ihr Typ inkonsistent wird, suchen Sie nach Ärger. Wenn Sie anfangen, die is_*-Funktion zu verwenden, neigt sie dazu, über Ihren gesamten Code verteilt zu sein. Und schließlich wissen Sie nie, ob das is_* notwendig ist und Ihr Code nicht lesbar ist. Ich schlage vor, dass Sie stattdessen den Ursprung der Typinkonsistenz beheben.
– mathk
11. August 2010 um 9:42 Uhr
@mathk Sie kommen wahrscheinlich aus einer stark typisierten Sprache. Die PHP-Variable kann alles speichern, deshalb sind is_array, is_numeric usw. benötigte Funktionen.
– Daniel Wu
22. November 2019 um 5:41 Uhr
Wladislav Rastrusny
Ich denke, der beste Ansatz hier ist, Ihren Code so zu planen, dass $items immer ein Array ist. Die einfachste Lösung besteht darin, es am Anfang Ihres Codes mit $items=array() zu initialisieren. Auf diese Weise stellt es ein leeres Array dar, auch wenn Sie ihm keinen Wert zuweisen.
Alle anderen Lösungen sind für mich ziemlich dreckige Hacks.
+1 Unterdrückung von Warnungen und Fehlern ist noch nie eine gute Idee.
– Christian
10. August 2010 um 7:16 Uhr
Ich habe das is_[array] Funktion, das klingt immer noch nach einer schlechten Programmierung. Lassen Sie mich erklären, warum: Warum fragen Sie, ob eine Variable ein Array ist? Sie sollten wissen, dass dies ein Array ist, sonst bedeutet dies, dass Sie mit dem Typ der Variablen herumspielen. Wenn Ihr Typ inkonsistent wird, suchen Sie nach Ärger. Wenn Sie anfangen, die is_*-Funktion zu verwenden, neigt sie dazu, über Ihren gesamten Code verteilt zu sein. Und schließlich wissen Sie nie, ob das is_* notwendig ist und Ihr Code nicht lesbar ist. Ich schlage vor, dass Sie stattdessen den Ursprung der Typinkonsistenz beheben.
– mathk
11. August 2010 um 9:42 Uhr
@mathk Sie kommen wahrscheinlich aus einer stark typisierten Sprache. Die PHP-Variable kann alles speichern, deshalb sind is_array, is_numeric usw. benötigte Funktionen.
– Daniel Wu
22. November 2019 um 5:41 Uhr
Peter Aytai
foreach((array)$items as $item) {}
13592500cookie-checksauberste Weg, um ein foreach zu überspringen, wenn das Array leer ist [duplicate]yes
Was? Wenn Sie die einfach auskommentieren
if
Sie haben dort, und ändern Sie die erste Zeile in$items = array();
, es funktioniert einwandfrei und arbeitet logisch. Zu deiner Frage muss noch mehr sein. Ist$items
vielleicht kein Array?– Nachzügler
10. August 2010 um 6:26 Uhr
Ich denke, es ist im Fall der Rückkehr von der Funktion, die auch falsch zurückgeben kann. Ich habe auch ein ähnliches Problem und überprüfe immer mit is_array
– KoolKabin
10. August 2010 um 6:34 Uhr
FYI – “foreach unterstützt nicht die Möglichkeit, Fehlermeldungen mit ‘@’ zu unterdrücken.` – php.net/manual/en/control-structures.foreach.php – Also, nein, Sie konnten nicht verwenden
@
– Peter Ajtai
10. August 2010 um 7:42 Uhr
+1 für Nachzügler. Wenn $items wirklich ein Array ist, gibt PHP keinen Fehler oder keine Warnung aus. Überprüfen Sie Ihre if/else-Zweige und stellen Sie sicher, dass Sie die Variable als Array initialisiert haben.
– csonuryilmaz
25. Februar 2013 um 4:05 Uhr
Sie können diese Situation bei Daten finden, die von einer nicht vertrauenswürdigen Funktion stammen. In diesem Fall ist ein if nicht unnötig und kann sogar besser/sauberer sein als einige andere Lösungen, die kryptischer und schwerer zu lesen sein könnten.
– Alejandro Moreno
6. Oktober 2014 um 15:49 Uhr