it-swarm.com.de

Überprüfung auf leere Arrays: count vs empty

Diese Frage zu ' Wie kann ich feststellen, ob ein PHP - Array leer ist ' hatte ich an diese Frage gedacht?

Gibt es einen Grund, warum count anstelle von empty verwendet werden sollte, wenn festgestellt wird, ob ein Array leer ist oder nicht?

Mein persönlicher Gedanke wäre, wenn die 2 für leere Arrays gleichwertig sind, sollten Sie empty verwenden, da dies eine boolesche Antwort auf eine boolesche Frage gibt. Aus der oben verlinkten Frage scheint count($var) == 0 die populärste Methode zu sein. Für mich macht es zwar technisch korrekt, aber keinen Sinn. Z.B. Q: $ var, bist du leer? A: 7. Hmmm...

Gibt es einen Grund, warum ich count == 0 verwenden sollte oder nur eine Frage des persönlichen Geschmacks?

Wie bereits in Kommentaren zu einer jetzt gelöschten Antwort darauf hingewiesen wurde, wirkt sich count auf die Leistung großer Arrays aus, da alle Elemente gezählt werden müssen, während empty aufhören kann, sobald sie weiß, dass sie nicht leer ist. Wenn sie also in diesem Fall dieselben Ergebnisse liefern, aber count möglicherweise ineffizient ist, warum sollten wir dann count($var) == 0 verwenden?

88
Dan McGrath

Im Allgemeinen verwende ich empty. Ich bin mir nicht sicher, warum die Leute das Zählen wirklich verwenden würden - Wenn das Array groß ist, dauert das Zählen länger/hat mehr Aufwand. Wenn Sie lediglich wissen müssen, ob das Array leer ist, verwenden Sie empty.

87
prodigitalson

Ich war neugierig, welche davon eigentlich schneller war, also habe ich ein einfaches Skript erstellt, um diese Funktionen zu bewerten.

<?php

function benchmark($name, $iterations, $action){
    $time=microtime(true);
    for($i=0;$i<=$iterations;++$i){
        $action();
    }
    echo $name . ' ' . round(microtime(true)-$time, 6) . "\n";
}

$iterations = 1000000;
$x = array();
$y = range(0, 10000000);
$actions = array(
    "Empty empty()" => function() use($x){
        empty($x);
    },
    "Empty count()" => function() use($x){
        count($x);
    },
    "Full empty()" => function() use($y){
        empty($y);
    },
    "Full count()" => function() use($y){
        count($y);
    },
    ############
    "IF empty empty()" => function() use($x){
        if(empty($x)){ $t=1; }
    },
    "IF empty count()" => function() use($x){
        if(count($x)){ $t=1; }
    },
    "IF full empty()" => function() use($y){
        if(empty($y)){ $t=1; }
    },
    "IF full count()" => function() use($y){
        if(count($y)){ $t=1; }
    },
    ############
    "OR empty empty()" => function() use($x){
        empty($x) OR $t=1;
    },
    "OR empty count()" => function() use($x){
        count($x) OR $t=1;
    },
    "OR full empty()" => function() use($y){
        empty($y) OR $t=1;
    },
    "OR full count()" => function() use($y){
        count($y) OR $t=1;
    },
    ############
    "IF/ELSE empty empty()" => function() use($x){
        if(empty($x)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE empty count()" => function() use($x){
        if(count($x)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE full empty()" => function() use($y){
        if(empty($y)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE full count()" => function() use($y){
        if(count($y)){ $t=1; } else { $t=2; }
    },
    ############
    "( ? : ) empty empty()" => function() use($x){
        $t = (empty($x) ? 1 : 2);
    },
    "( ? : ) empty count()" => function() use($x){
        $t = (count($x) ? 1 : 2);
    },
    "( ? : ) full empty()" => function() use($y){
        $t = (empty($y) ? 1 : 2);
    },
    "( ? : ) full count()" => function() use($y){
        $t = (count($y) ? 1 : 2);
    }
);

foreach($actions as $name => $action){
    benchmark($name, $iterations, $action);
}
//END

Da ich dies tat, habe ich auch versucht, die Leistung zu überprüfen, die Operationen ausführt, die normalerweise mit count ()/empty () verbunden wären

Verwendung von PHP 5.4.39:

Empty empty() 0.118691
Empty count() 0.218974
Full empty() 0.133747
Full count() 0.216424
IF empty empty() 0.166474
IF empty count() 0.235922
IF full empty() 0.120642
IF full count() 0.248273
OR empty empty() 0.123875
OR empty count() 0.258665
OR full empty() 0.157839
OR full count() 0.224869
IF/ELSE empty empty() 0.167004
IF/ELSE empty count() 0.263351
IF/ELSE full empty() 0.145794
IF/ELSE full count() 0.248425
( ? : ) empty empty() 0.169487
( ? : ) empty count() 0.265701
( ? : ) full empty() 0.149847
( ? : ) full count() 0.252891

Verwenden von HipHop VM 3.6.1 (dbg)

Empty empty() 0.210652
Empty count() 0.212123
Full empty() 0.206016
Full count() 0.204722
IF empty empty() 0.227852
IF empty count() 0.219821
IF full empty() 0.220823
IF full count() 0.221397
OR empty empty() 0.218813
OR empty count() 0.220105
OR full empty() 0.229118
OR full count() 0.221787
IF/ELSE empty empty() 0.221499
IF/ELSE empty count() 0.221274
IF/ELSE full empty() 0.221879
IF/ELSE full count() 0.228737
( ? : ) empty empty() 0.224143
( ? : ) empty count() 0.222459
( ? : ) full empty() 0.221606
( ? : ) full count() 0.231288

Schlussfolgerungen, wenn Sie PHP verwenden:

  1. empty () ist in beiden Szenarien mit einem leeren und bestückten Array viel schneller als count ()

  2. count () führt dasselbe mit einem vollständigen oder leeren Array aus.

  3. Das Ausführen einer einfachen IF oder nur einer booleschen Operation ist dasselbe.

  4. IF/ELSE ist etwas effizienter als (?:). Wenn Sie nicht Milliarden von Iterationen mit Ausdrücken in der Mitte durchführen, ist dies völlig unbedeutend.

Schlussfolgerungen, wenn Sie HHVM verwenden:

  1. empty () ist ein Teeny-weeny etwas schneller als count (), aber unbedeutend.

    [Der Rest ist derselbe wie in PHP]

Wenn Sie nur wissen möchten, ob das Array leer ist, verwenden Sie immer leer ().

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 den Produktionsablauf wider.

39
Satake

Ich denke, es ist nur persönliche Präferenz. Einige Leute mögen sagen, dass empty schneller ist (z. B. http://jamessocol.com/projects/count_vs_empty.php ), während andere sagen, count ist besser, da es ursprünglich für Arrays gedacht war. empty ist allgemeiner und kann auf andere Typen angewendet werden.

php.net gibt jedoch die folgende Warnung für count aus:

count () gibt möglicherweise 0 für eine nicht festgelegte Variable zurück, kann jedoch auch 0 für eine Variable zurückgeben, die mit einem leeren Array initialisiert wurde. Verwenden Sie isset (), um zu testen, ob eine Variable festgelegt ist.

Mit anderen Worten, wenn die Variable nicht gesetzt ist, erhalten Sie von PHP einen Hinweis, dass sie nicht definiert ist. Vor der Verwendung von count sollte die Variable daher vorzugsweise mit isset überprüft werden. Dies ist bei empty nicht erforderlich.

Gibt es einen Grund, warum count verwendet werden sollte, um zu bestimmen, ob ein Array leer ist oder nicht?

Wenn Sie etwas an einem nicht leeren Array tun müssen, wenn Sie dessen Größe kennen:

if( 0 < ( $cnt = count($array) ) )
{
 echo "Your array size is: $cnt";
}
else
 echo "Too bad, your array is empty :(";

Ich würde jedoch nicht die Verwendung von count empfehlen, es sei denn, Sie sind zu 100% sicher, dass Sie ein Array zählen. In letzter Zeit habe ich Code debuggen lassen, bei dem bei Fehlerfunktion FALSE anstelle eines leeren Arrays zurückgegeben wurde.

var_dump(count(FALSE));

ausgabe:

int 1

Seitdem verwende ich empty oder if(array() === $array), um sicherzugehen, dass ich array das leer ist.

10

Alternativ können Sie die Variable als Boolean (implizit oder explizit) umwandeln:

if( $value )
{
  // array is not empty
}

if( (bool) $value )
{
  // array is still not empty
}

Diese Methode generiert einen E_NOTICE, wenn die Variable nicht definiert ist, ähnlich wie count().

Weitere Informationen finden Sie auf der Handbuchseite PHP über Typvergleiche .

5
user212218

count() scheint mit Array-ähnlichen Schnittstellen, die ArrayAccess/Countable implementieren, besser zu funktionieren. empty() gibt für diese Art von Objekten true zurück, auch wenn sie keine Elemente enthalten. Normalerweise implementieren diese Klassen die Countable-Schnittstelle. Wenn die Frage lautet: "Enthält diese Auflistung Elemente?" ohne eine Annahme über die Implementierung zu machen, ist count() die bessere Option.

5
Ryan

Ich persönlich bevorzuge die Codierung von Eleganz (in Bezug auf meinen spezifischen Anwendungsfall). Ich stimme mit Dan McG insofern überein, dass count () nicht mit dem korrekten Datentyp (in diesem Fall boolean) für den fraglichen Test reagiert, der den Entwickler dazu zwingt, mehr Code zu schreiben, um eine 'if'-Anweisung zu füllen.

Ob dies einen erheblichen Einfluss auf die Leistung hat, ist nur für sehr große Arrays fraglich (für die Sie in den meisten Setups ohnehin nicht genügend Speicherplatz haben).

Insbesondere beim PHP-Array $ _POST erscheint es meiner Meinung nach viel "logischer" zu schreiben/zu sehen:

if ( !empty ( $_POST ) ) {
    // deal with postdata
}
3
simonhamp

Ich hoffe, dass dies jemandem helfen kann, obwohl es bereits beantwortet wurde (und darüber diskutiert wurde). In meinem eigenen Szenario weiß ich, dass alle meine Arrays über 7 Elemente verfügen (Prüfungen wurden früher in meinem Code vorgenommen), und ich führe einen array_diff aus, der natürlich ein Array von Null zurückgibt, wenn er gleich ist.

Ich hatte 34 Sekunden für count und 17 Sekunden für empty. Beide geben mir die gleichen Berechnungen, so dass mein Code immer noch in Ordnung ist.

Sie können jedoch auch == oder === wie in PHP versuchen - Prüfen Sie, ob zwei Arrays gleich sind. Das Beste, was ich sagen würde, ist versuch count vs empty vs == empty array, dann sehen Sie, was Ihre eigenen besten Perfs gibt. In meinem Fall war count am langsamsten, so dass ich empty verwende, jetzt ... wird als nächstes serialize geprüft

3
xchiltonx

Manchmal ist die Verwendung von Leerzeichen ein Muss. Zum Beispiel diesen Code:

$myarray = array();

echo "myarray:"; var_dump($myarray); echo "<br>";
echo "case1 count: ".count($myarray)."<br>";
echo "case1 empty: ".empty($myarray)."<br>";

$glob = glob('sdfsdfdsf.txt');

echo "glob:"; var_dump($glob); echo "<br>";
echo "case2 count: ".count($glob)."<br>";
echo "case2 empty: ".empty($glob);

Wenn Sie diesen Code wie folgt ausführen: http://phpfiddle.org/main/code/g9x-uwi

Sie erhalten diese Ausgabe:

myarray:array(0) { } 
case1 count: 0
case1 empty: 1

glob:bool(false) 
case2 count: 1
case2 empty: 1

Wenn Sie also die leere Glob-Ausgabe count verwenden, erhalten Sie eine falsche Ausgabe. Sie sollten auf Leere überprüfen.

Aus glob Dokumentation:

Gibt ein Array zurück, das die übereinstimmenden Dateien/Verzeichnisse enthält, ein leeres Array, wenn keine Datei gefunden wurde oder im Fehlerfall FALSE.
Hinweis: Auf einigen Systemen ist es Es ist nicht möglich, zwischen einem leeren Treffer und einem Fehler zu unterscheiden.

Überprüfen Sie auch diese Frage: Warum zählt (falsch) 1 zurück?

1
trante

Es gibt keinen triftigen Grund, count($myArray) == 0 gegenüber empty($myArray) den Vorzug zu geben. Sie haben identische Semantik. Einige finden eine lesbarer als die andere. Die eine Leistung ist geringfügig besser als die andere, aber es ist wahrscheinlich kein wesentlicher Faktor für die große Mehrheit der PHP-Anwendungen. Für alle praktischen Zwecke ist die Wahl Geschmackssache.

1
Asaph

Da eine als negativ analysierte Variable int(1) mit count()

Ich bevorzuge ($array === [] || !$array), um ein leeres Array zu testen.

Ja, wir sollten ein leeres Array erwarten, aber keine gute Implementierung von Funktionen ohne erzwungene Rückgabetypen.

Beispiele mit count()

var_dump(count(0));
> int(1)
var_dump(count(false));
> int(1)
0
Sdlion

Ich mache meine Gedanken Jungs wieder, danke.

Ok, es gibt keinen Unterschied zwischen der Verwendung von empty und count. Technisch gesehen sollte count für Arrays verwendet werden, und empty könnte sowohl für Arrays als auch für Strings verwendet werden. In den meisten Fällen sind sie austauschbar und wenn Sie die Php-Dokumente sehen, sehen Sie die Vorschlagsliste von count, wenn Sie sich in empty befinden und umgekehrt.

0
Sarfraz