Ich möchte eine foreach
Schleife mit einer Variablen verwenden, aber diese Variable kann NULL
zum Beispiel viele verschiedene Typen haben .
Also bevor foreach
ich es teste:
if(is_array($var)){
foreach($var as ...
Mir wurde jedoch klar, dass es sich auch um eine Klasse handeln kann, die eine Iterator
Schnittstelle implementiert . Vielleicht bin ich blind, aber wie kann ich überprüfen, ob die Klasse eine Schnittstelle implementiert? Gibt es so etwas wie is_a
Funktion oder inherits
Operator? Ich habe festgestellt class_implements
, ich kann es verwenden, aber vielleicht gibt es etwas Einfacheres?
Und zweitens, wichtiger, ich nehme an, diese Funktion existiert, würde ausreichen, um zu überprüfen, ob die Variable is_array
oder " Iterator
Schnittstelle implementiert " oder sollte ich auf etwas mehr testen?
Antworten:
Wenn Sie
foreach
innerhalb einer Funktion verwenden und ein Array oder ein Traversable- Objekt erwarten , können Sie einen Hinweis auf diese Funktion eingeben mit:Wenn Sie keine
foreach
Funktion verwenden oder beides erwarten , können Sie mit diesem Konstrukt einfach überprüfen, ob Sie die Variable durchlaufen können:quelle
is_array
, dass es teuer war. Die Rechenkosten schienen mit der Größe des Arrays zu steigen (was keinen Sinn macht, da nur geprüft wird, ob es sich um ein Array handelt). Aber es ist mir schockierend in einer Bibliothek passiert. Siehe meinen Kommentar in der verknüpften Frage. Funktioniertinstanceof Traversable
mit Arrays? Ich hatte keine Gelegenheit, seine Leistung zu testen.Traversable
so ja.$var = array(1,2,3);
den Ergebnissen sind:is_array($var) = true
und$var instanceof Traversable = false
.Iterator
und funktionieren daher nicht mitTraversable
.foreach
kann mit Arrays und Objekten umgehen. Sie können dies überprüfen mit:Sie müssen nicht speziell nachsehen,
Traversable
wie andere es in ihren Antworten angedeutet haben, da alle Objekte - wie alle Arrays - in PHP durchlaufbar sind.Technischer:
( Quelle )
Einfach gesagt in der gängigen PHP-Programmierung, wann immer eine Variable ist
und ist nicht
Sie können darauf verwenden
foreach
.quelle
Sie können die Instanz von
Traversable
mit einer einfachen Funktion überprüfen . Dies würde für all dies funktionieren,Iterator
weilIterator extends Traversable
quelle
gibt
bool(false)
oder zurückbool(true)
quelle
Funktionen
Beispiel
quelle
Seit PHP 7.1 gibt es
iterable
genau für diesen Zweck einen Pseudotyp . Typhinweiseiterable
akzeptieren jedes Array sowie jede Implementierung derTraversable
Schnittstelle. PHP 7.1 führte auch die Funktion einis_iterable()
. Für ältere Versionen finden Sie hier andere Antworten, um die gleichwertige Typdurchsetzung ohne die neueren integrierten Funktionen zu erreichen.Fairplay: Wie BlackHole hervorhob, scheint diese Frage ein Duplikat von Iterable-Objekten und Hinweisen auf Array-Typen zu sein. und seine oder ihre Antwort geht detaillierter als meine.
quelle