- Was ist der effizienteste Weg, um zu überprüfen, ob ein Array ein flaches Array primitiver Werte oder ein mehrdimensionales Array ist ?
- Gibt es eine Möglichkeit, dies zu tun, ohne tatsächlich ein Array zu durchlaufen und
is_array()
auf jedem seiner Elemente zu laufen ?
137
Antworten:
Die kurze Antwort lautet: Nein, Sie können es nicht tun, ohne zumindest implizit eine Schleife zu erstellen, wenn sich die 'zweite Dimension' irgendwo befinden könnte. Wenn es im ersten Element sein muss, würden Sie es einfach tun
Der effizienteste allgemeine Weg, den ich finden könnte, ist die Verwendung einer foreach-Schleife im Array, die kurzgeschlossen wird, wenn ein Treffer gefunden wird (zumindest ist die implizite Schleife besser als die gerade für ()):
Implizite Schleife, aber wir können nicht kurzschließen, sobald eine Übereinstimmung gefunden wird ...
quelle
is_multi()
optimieren Sie den Code, indem Siereturn count($rv)>0
Verwenden Sie count () zweimal. einmal im Standardmodus und einmal im rekursiven Modus. Wenn die Werte übereinstimmen, ist das Array nicht mehrdimensional, da ein mehrdimensionales Array eine höhere rekursive Anzahl aufweisen würde.
Dieser zweite Wert der Option
mode
wurde in PHP 4.2.0 hinzugefügt. Aus den PHP-Dokumenten :Diese Methode erkennt jedoch nicht
array(array())
.quelle
Für PHP 4.2.0 oder neuer:
quelle
array(array())
oder aucharray(array(), array())
nicht. Wenn ein inneres Array leer ist, addiert die rekursive Anzahl im Allgemeinen korrekt 0 für dieses Array, sodass es mit der normalen Anzahl übereinstimmt.Ich denke, dies ist der einfachste Weg und auf dem neuesten Stand der Technik:
quelle
Sie können dies einfach ausführen:
Wenn der optionale Modusparameter auf
COUNT_RECURSIVE
(oder 1) gesetzt ist, zählt count () das Array rekursiv. Dies ist besonders nützlich, um alle Elemente eines mehrdimensionalen Arrays zu zählen.Wenn es dasselbe ist, bedeutet dies, dass es nirgendwo Unterebenen gibt. Einfach und schnell!
quelle
if(count($tasks_by_date) !== count($tasks_by_date, 1))
!==
wurde verwendet, um zu sehen, ob es eine Unterebene gibt. Für Theorien, die nach etwas Ähnlichem suchen ... usw.!==
Sie können
is_array()
das erste Element überprüfen , unter der Annahme, dass, wenn das erste Element eines Arrays ein Array ist, auch der Rest von ihnen.quelle
if( is_array(current($arr)) ) { // is multidimensional }
Alles gute Antworten ... hier sind meine drei Zeilen, die ich immer benutze
quelle
Diese Funktion gibt die Anzahl der Array-Dimensionen zurück (von hier gestohlen ).
quelle
Ich denke, Sie werden feststellen, dass diese Funktion der einfachste, effizienteste und schnellste Weg ist.
Sie können es so testen:
quelle
foreach($a as $v) is_array($v) ? return TRUE : return FALSE;
foreach($a as $v) return is_array($v) ? true : false;
Sie können auch eine einfache Überprüfung wie folgt durchführen:
quelle
Versuchen Sie es wie folgt
quelle
Auch das funktioniert
Wenn false, ist es ein eindimensionales Array. Wenn true, ist es ein mehrdimensionales Array.
current gibt Ihnen das erste Element Ihres Arrays und prüft anhand der Funktion is_array , ob das erste Element ein Array ist oder nicht .
quelle
Verwenden Sie nicht COUNT_RECURSIVE
Klicken Sie auf diese Seite, um zu erfahren, warum
Verwenden Sie rsort und dann isset
quelle
In meinem Fall. Ich steckte in unterschiedlichem seltsamen Zustand fest.
1. Fall =
array("data"=> "name");
2. Fall =
array("data"=> array("name"=>"username","fname"=>"fname"));
Wenn
data
jedoch ein Array anstelle eines Werts vorhanden ist, funktioniert die Funktion sizeof () oder count () für diese Bedingung nicht. Dann erstelle ich eine benutzerdefinierte Funktion zu überprüfen.Wenn der erste Index des Arrays einen Wert hat, gibt er "nur Wert" zurück.
Wenn der Index jedoch ein Array anstelle eines Werts hat, gibt er "hat ein Array" zurück.
Ich verwende diesen Weg
Besonderer Dank geht an Vinko Vrsalovic
quelle
Nach PHP 7 können Sie einfach Folgendes tun:
quelle
Ich denke, dieser ist edel (Requisiten an einen anderen Benutzer, dessen Benutzername ich nicht kenne):
quelle
Alle oben genannten Methoden sind zu komplex für eine schnelle Einführung. Wenn ein Array flach ist, sollte das Testen des ersten Elements ein Grundelement zurückgeben, z. B. int, string usw. Wenn es mehrdimensional ist, sollte es ein Array zurückgeben. Als Erweiterung können Sie diesen Einzeiler schnell und ordentlich verwenden.
Wenn dies true zurückgibt, ist das Array mehrdimensional. Sonst ist es flach. Zu beachten ist, dass Arrays sehr selten unterschiedliche Dimensionen haben, z. B. wenn Sie Daten aus einem Modell generieren, haben sie immer dieselbe Art von mehrdimensionaler oder flacher Struktur, die von Schleifen durchlaufen werden kann. Wenn dies nicht der Fall ist, haben Sie es von Hand angefertigt, was bedeutet, dass Sie wissen, wo sich alles befindet, und es funktioniert einfach, ohne dass Sie einen Schleifenalgorithmus schreiben müssen
quelle
array_shift()
, da es entfernt das erste Element und setzt auch numerische Tasten! Besser verwenden,current()
wenn es immer noch nach einem Einzeiler juckt.Zusätzlich zu den vorherigen Antworten und abhängig vom Schema des Arrays, das Sie überprüfen möchten:
quelle
Es ist so einfach wie
quelle
Hier ist ein schöner Einzeiler. Es durchläuft jeden Schlüssel, um zu überprüfen, ob der Wert an diesem Schlüssel ein Array ist. Dies wird wahr sein
quelle
quelle
if (isset($array[0])) { }
. Wenn Sie sicher sind, beginnen die Indizes des Arrays von 0* nur für Arrays mit numerischem Index
quelle
Die native Funktion print_r gibt eine für Menschen lesbare Zeichenfolge zurück. Zählen Sie einfach die "Array" -Instanzen.
Versuchen...
Auf meiner Box hat "is_multi in 500000-mal 0,83681297302246 Sekunden gedauert"
Mit freundlicher Genehmigung von Ruach HaKodesh
quelle
quelle
Keine Schleifen, schlicht und einfach.
Funktioniert auch mit zugeordneten Arrays, nicht nur mit numerischen Arrays, die keine 0 enthalten können (wie im vorherigen Beispiel wird eine Warnung ausgegeben, wenn das Array keine 0 hat).
quelle