Diese Frage zu " Wie man erkennt, ob ein PHP-Array leer ist " ließ mich an diese Frage denken
Gibt es einen Grund, der count
verwendet werden sollte, anstatt empty
festzustellen, ob ein Array leer ist oder nicht?
Mein persönlicher Gedanke wäre, wenn die 2 für den Fall leerer Arrays gleichwertig sind, die Sie verwenden sollten, empty
da sie eine boolesche Antwort auf eine boolesche Frage geben. Aus der oben verlinkten Frage geht hervor, dass dies count($var) == 0
die beliebte Methode ist. Für mich macht es zwar technisch korrekt, aber keinen Sinn. ZB F: $ var, bist du leer? A: 7 . Hmmm...
Gibt es einen Grund, den ich count == 0
stattdessen verwenden sollte, oder nur eine Frage des persönlichen Geschmacks?
Wie von anderen in den Kommentaren für eine jetzt gelöschte Antwort hervorgehoben, count
hat dies Auswirkungen auf die Leistung großer Arrays, da alle Elemente gezählt werden müssen, während empty
sie angehalten werden können, sobald sie wissen, dass sie nicht leer sind. Wenn sie in diesem Fall die gleichen Ergebnisse liefern, aber count
möglicherweise ineffizient sind, warum sollten wir sie dann jemals verwenden count($var) == 0
?
false
PHP - keine Notwendigkeit fürempty()
odercount()
.if (!$myArray) { echo "array is empty"; }
sandbox.onlinephpfunctions.com/code/…empty()
.Antworten:
Ich benutze im Allgemeinen
empty
. Ich bin mir nicht sicher, warum Leute count wirklich verwenden würden - Wenn das Array groß ist, dauert count länger / hat mehr Overhead. Wenn Sie nur wissen müssen, ob das Array leer ist oder nicht, verwenden Sie leer.quelle
O(1)
, da PHP die Anzahl der Elemente intern speichert. Überprüfen Sie heraus diese Antwort stackoverflow.com/a/5835419/592454Ich war neugierig zu sehen, welches tatsächlich schneller ist, also habe ich ein einfaches Skript erstellt, um diese Funktionen zu bewerten.
Seitdem habe ich auch versucht, die Leistung bei Operationen zu überprüfen, die normalerweise mit count () / empty () verbunden sind.
Verwenden von PHP 5.4.39:
Verwenden von HipHop VM 3.6.1 (dbg)
Schlussfolgerungen, wenn Sie PHP verwenden:
empty () ist in beiden Szenarien viel schneller als count (), mit einem leeren und aufgefüllten Array
count () führt dasselbe mit einem vollständigen oder leeren Array aus.
Das Ausführen einer einfachen IF oder nur einer Booleschen Operation ist dasselbe.
IF / ELSE ist etwas effizienter als (? :). Wenn Sie nicht Milliarden von Iterationen mit Ausdrücken in der Mitte ausführen, ist dies völlig unbedeutend.
Schlussfolgerungen, wenn Sie HHVM verwenden:
empty () ist ein kleines bisschen schneller als count (), aber unbedeutend.
[Der Rest ist der gleiche wie in PHP]
Wenn Sie nur wissen möchten, ob das Array leer ist, verwenden Sie abschließend immer empty ().
Dies war nur ein merkwürdiger Test, der einfach durchgeführt wurde, ohne viele Dinge zu berücksichtigen. Es ist nur ein Proof of Concept und spiegelt möglicherweise nicht die Produktionsabläufe wider.
quelle
if($x){
schneller ist alsif(empty($x)){
(funktioniert nur, wenn Sie wissen, dass$x
er deklariert wurde).count
undempty
die if-Anweisung aufruft. Dann kommt dasempty
und dauert dascount
. Aber im Vergleich zu Ihrer im bloßen Fall ist die Leere zehnmal schneller! Einfacher Array-Test: 0.104662, leer: 0.177659, Anzahl: 1.175125 unter PHP 5.6, andernfalls liefert Ihr Code auch bei dieser Version das gleiche Ergebnis wie bei Ihrem erwähnten. Es sind nur falsche Ergebnisse.Ich denke, es ist nur eine persönliche Präferenz. Einige Leute sagen vielleicht, es
empty
sei schneller (z. B. http://jamessocol.com/projects/count_vs_empty.php ), während andere sagen könnten, escount
sei besser, da es ursprünglich für Arrays gemacht wurde.empty
ist allgemeiner und kann auf andere Typen angewendet werden.php.net gibt jedoch die folgende Warnung aus
count
:Mit anderen Worten, wenn die Variable nicht festgelegt ist, erhalten Sie von PHP eine Benachrichtigung, dass sie undefiniert ist. Daher ist es vor der Verwendung
count
vorzuziehen, die Variable mit zu überprüfenisset
. Dies ist bei nicht erforderlichempty
.quelle
count
ist, dass es ursprünglich für Arrays gemacht wurde ... Objekte können jedoch implementiert werdenCountable
, und Sie können Skalarwerte an übergebencount()
und ein gültiges Ergebnis erhalten.isset()
Punkt. Wenn Sie sich Sorgen über Hinweise in PHP machen, sollten Sie Ihr Array bereits deklariert haben. Wenn Sie PHP Ihr Array dynamisch deklarieren lassen, erhalten Sie auch an dieser Stelle eine Benachrichtigung. Ich denke, der eigentliche Punkt der Warnung auf php.net ist, dass Sie nicht verwenden sollten,count
um festzustellen, ob ein Array deklariert wurde oder nicht, da es das gleiche Ergebnis liefert wie ein leeres Array.Wenn Sie etwas für ein nicht leeres Array tun müssen, wissen Sie, wie groß es ist:
Aber ich würde nicht empfehlen, count zu verwenden, es sei denn, Sie sind sich zu 100% sicher, dass das, was Sie zählen, ein Array ist. In letzter Zeit habe ich Code debuggt, bei dem eine Fehlerfunktion
FALSE
anstelle eines leeren Arrays zurückgegeben wurde, und ich habe Folgendes entdeckt:Ausgabe:
Seitdem verwende ich
empty
oderif(array() === $array)
um sicherzugehen, dass ich ein Array habe , das leer ist.quelle
count()
scheint mit Array-ähnlichen Schnittstellen, die implementiert werden, besser zu funktionierenArrayAccess/Countable
.empty()
Gibt true für diese Art von Objekten zurück, auch wenn sie keine Elemente enthalten. In der Regel implementieren diese Klassen dieCountable
Schnittstelle. Wenn die Frage lautet: "Enthält diese Sammlung Elemente?" Ohne eine Annahme über die Implementierung zu machen,count()
ist dies eine bessere Option.quelle
empty
gibt für diese Art von Objekten false zurück, auch wenn sie keine Elemente enthalten"?count
einer flexibleren und erweiterbare Lösung wäre, wenn immer es sinnvoll für Ihren Code macht eine „gemeinsame“ Art und Weise eine Sammlung umgesetzt zu akzeptieren ... IMO das könnte die nur die relevanten Kriterien für die Definition, wenn Sie verwendencount
oder andere Weise ...count()
ab 7.2 ist, dass keine leeren Variablen mehr aufgenommen werden können.Alternativ können Sie die Variable als Booleschen Wert (implizit oder explizit) umwandeln:
Diese Methode generiert eine,
E_NOTICE
wenn die Variable nicht definiert ist, ähnlich wiecount()
.Weitere Informationen finden Sie auf der Seite PHP-Handbuch zu Typvergleichen .
quelle
empty()
Sie es nur, wenn Sie explizit versuchen, das Auslösen eines E_NOTICE zu vermeiden (was im Allgemeinen eine schlechte Idee ist, IMO). Die offensichtliche Verwendung von leer führt zu fehlerhaftem Code.Meine persönliche Präferenz ist eher das Codieren von Eleganz (in Bezug auf meinen spezifischen Anwendungsfall). Ich stimme Dan McG insofern zu, als count () nicht mit dem richtigen Datentyp (in diesem Fall boolesch) für den fraglichen Test antwortet und den Entwickler dazu zwingt, mehr Code zu schreiben, um eine 'if'-Anweisung zu füllen.
Ob dies einen signifikanten Einfluss auf die Leistung hat, ist nur für extrem große Arrays umstritten (für die Sie in den meisten Setups wahrscheinlich ohnehin nicht genügend Speicherzuweisung haben).
Insbesondere wenn es um das $ _POST-Array von PHP geht, erscheint es meiner Meinung nach viel "logischer", zu schreiben / zu sehen:
quelle
Hoffe, dies könnte jemandem helfen, obwohl es bereits beantwortet wurde (und was diskutiert wurde). In meinem eigenen Szenario weiß ich, dass alle meine Arrays 7 Elemente haben (Überprüfungen wurden früher in meinem Code durchgeführt) und ich führe eine aus
array_diff
das natürlich ein Array von Null zurückgibt, wenn es gleich ist.Ich hatte 34 Sekunden für
count
und 17 Sekunden fürempty
. Beide geben mir die gleichen Berechnungen, so dass mein Code immer noch in Ordnung ist.Sie können jedoch auch das
==
oder===
wie in PHP ausprobieren - Überprüfen Sie, ob zwei Arrays gleich sind . Das Beste, was ich sagen würde, ist versuchencount
gegenempty
vs== empty array
, dann sehen Sie, welche Ihre eigenen besten Perfs gibt. In meinem Fallcount
war der langsamste, also benutze ichempty
jetzt ... werde alsserialize
nächstes prüfenquelle
Es gibt keinen guten Grund zu bevorzugen
count($myArray) == 0
überempty($myArray)
. Sie haben identische Semantik. Einige finden vielleicht eine besser lesbar als die andere. Eine Leistung ist möglicherweise geringfügig besser als die andere, aber bei der überwiegenden Mehrheit der PHP-Anwendungen ist dies wahrscheinlich kein wesentlicher Faktor. Für alle praktischen Zwecke ist die Wahl Geschmackssache.quelle
count
Sie diese Option,empty
wenn Sie zählen müssen. Verwenden Sie diese Option, wenn Sie überprüfen müssen, ob die Sammlung leer ist. Natürlich gibt es Randfälle wie Zeichenfolgen oder Nullen, aber der Programmierer muss über seinen Code nachdenken. Sie können nicht zustimmen, Sie dürfen.Manchmal ist es ein Muss, leer zu verwenden. Zum Beispiel dieser Code:
Wenn Sie diesen Code folgendermaßen ausführen: http://phpfiddle.org/main/code/g9x-uwi
Sie erhalten diese Ausgabe:
Also, wenn Sie
count
die leere Glob-Ausgabe haben, erhalten Sie eine falsche Ausgabe. Sie sollten auf Leere prüfen.Aus der Glob- Dokumentation:
Überprüfen Sie auch diese Frage: Warum zählen (falsch) 1 zurück?
quelle
Da eine als negativ analysierte Variable
int(1)
mit zurückkehren würdecount()
Ich teste lieber
($array === [] || !$array)
auf ein leeres Array.Ja, wir sollten ein leeres Array erwarten, aber wir sollten keine gute Implementierung von Funktionen ohne erzwungene Rückgabetypen erwarten.
Beispiele mit
count()
quelle
Ich habe meine Gedanken neu gemacht, Leute, danke.
Ok, es gibt keinen Unterschied zwischen der Verwendung von
empty
undcount
. Technischcount
sollte für Arrays verwendet werden undempty
könnte sowohl für Arrays als auch für Strings verwendet werden. In den meisten Fällen sind sie also austauschbar. Wenn Sie die PHP-Dokumente sehen, sehen Sie die Vorschlagsliste,count
ob Sie sich gerade befindenempty
und umgekehrt.quelle