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

    – 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

Benutzer-Avatar
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

Benutzer-Avatar
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)…

    – Christoph K.

    17. Januar 2017 um 14:28 Uhr

Benutzer-Avatar
Matt Williamson

$items = array('a','b','c');

if(is_array($items)) {
  foreach($items as $item) {
    print $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 arraywenn 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.

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
Peter Aytai

foreach((array)$items as $item) {}

1359250cookie-checksauberste Weg, um ein foreach zu überspringen, wenn das Array leer ist [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy