Betrachten Sie diese 2 Beispiele ...
$key = 'jim';
// example 1
if (isset($array[$key])) {
// ...
}
// example 2
if (array_key_exists($key, $array)) {
// ...
}
Ich bin daran interessiert zu wissen, ob eines davon besser ist. Ich habe immer das erste Beispiel verwendet, aber viele Leute haben das zweite Beispiel auf dieser Site verwendet.
Also, was ist besser? Schneller? Klarere Absicht?
php
performance
Alex
quelle
quelle
isset
wird sich niemals genau so verhalten, wiearray_key_exists
das Codebeispiel, das angeblich dazu führt, dass es sich identisch verhält, einen Hinweis auslöst, wenn der Schlüssel nicht existiert.in_array
? maettig.com/1397246220in_array
ist ,O(n)
weil sie die Werte nicht die Schlüssel überprüft. Sie werden fast immer langsamer sein, es sei denn, Sien
sind extrem klein.$array[$key] === null
?Antworten:
isset()
ist schneller, aber es ist nicht dasselbe wiearray_key_exists()
.array_key_exists()
prüft lediglich, ob der Schlüssel vorhanden ist, auch wenn der Wert istNULL
.Wobei zurückgegeben
isset()
wird,false
wenn der Schlüssel existiert und der Wert istNULL
.quelle
isset
ist keine Array-Suchfunktion, sondern überprüft nur das Vorhandensein einer Variablen in der Symboltabelle und iteriert nicht über das Array.array_key_exists
Auf der anderen Seite wird nach den Schlüsseln in der ersten Dimension des angegebenen Arrays iteriert / gesucht.array_key_exists()
dass nur geprüft wird, ob sich der Schlüssel im Array befindet, was bedeutet, dass keine Suche durchgeführt wird, da es sich um eine Hash-Tabelle handelt.Wenn Sie an einigen Tests interessiert sind, die ich kürzlich durchgeführt habe:
https://stackoverflow.com/a/21759158/520857
Zusammenfassung:
quelle
Nun, der Hauptunterschied besteht darin , dass
isset()
keine Rücktrue
für Array - Schlüssel , die entsprechen einem Nullwert, während derarray_key_exists()
Fall ist.Das Ausführen eines kleinen Benchmarks zeigt, dass
isset()
es schneller ist, aber möglicherweise nicht ganz genau.quelle
isset($array[$i]) || $array[$i] === null
macht keinen Sinn, weil estrue
für jeden Fall zurückkehren wird. Sie werden niemals falsch sein,isset($array[$i]) || $array[$i] === null
unabhängig von den Eingaben.Ich wollte meine 2 Cent zu dieser Frage hinzufügen, da mir ein Mittelweg fehlte.
Wie bereits erwähnt,
isset()
wird der Wert des Schlüssels ausgewertet, sodass zurückgegeben wird,false
wenn dieser Wert angegeben ist.null
Dortarray_key_exists()
wird nur geprüft, ob der Schlüssel im Array vorhanden ist.Ich habe einen einfachen Benchmark mit PHP 7 durchgeführt. Die angezeigten Ergebnisse sind die Zeit, die zum Beenden der Iteration benötigt wurde:
Ich habe die Ergebnisse dieser benutzerdefinierten Funktion auch zur Vervollständigung mit diesem Benchmark hinzugefügt:
Wie gesehen und bereits gesagt
isset()
ist die schnellste Methode, kann aber false zurückgeben, wenn der Wert istnull
. Dies könnte zu unerwünschten Ergebnissen führen und sollte normalerweise verwendet werden,array_key_exists()
wenn dies der Fall ist.Es gibt jedoch einen Mittelweg und das nutzt
isset() || array_key_exists()
. Dieser Code wird unter Verwendung der Regel die schnellere Funktionisset()
und wennisset()
false zurück nur dann verwenden ,array_key_exists()
zu validieren. In der obigen Tabelle ist es genauso schnell wie ein klarer Anrufisset()
.Ja, es ist ein bisschen mehr zu schreiben und es in eine Funktion zu packen ist langsamer, aber viel einfacher. Wenn Sie dies für die Leistung, das Überprüfen von Big Data usw. benötigen, schreiben Sie es vollständig aus. Andernfalls ist der sehr geringe Funktionsaufwand
array_key_isset()
vernachlässigbar , wenn es sich um eine einmalige Verwendung handelt.quelle
Mit Php 7 gibt es die Möglichkeit, den Null Coalescing Operator zu verwenden .
Jetzt können Sie einen Standardwert zuweisen, falls der Wert null ist oder der Schlüssel nicht vorhanden ist:
quelle
Es gibt einen Unterschied zu php.net, den Sie lesen werden:
Ein sehr informeller Test zeigt
array_key_exists()
, dass er etwa 2,5-mal langsamer ist alsisset()
quelle
Die Kombination
isset()
undis_null()
gibt die beste Leistung gegen andere Funktionen wie:array_key_exists()
,isset()
,isset()
+array_key_exists()
,is_null()
,isset()
+is_null()
, hier das einzige Problem ist die Funktion nur falsch es wird bestätigt , wenn der Schlüssel nicht vorhanden ist , sondern auch der Schlüssel exist und hat einen Nullwert.Benchmark-Skript:
Gutschrift : http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/
quelle
Was "schneller" betrifft: Probieren Sie es aus (mein Geld ist an
array_key_exists()
, aber ich kann es momentan nicht versuchen).Zu "klarer in der Absicht":
array_key_exists()
quelle
Offensichtlich ist das zweite Beispiel klarer in der Absicht, es gibt keine Frage. Um herauszufinden, was Beispiel 1 tut, müssen Sie mit den variablen Initialisierungs-Eigenheiten von PHP vertraut sein - und dann werden Sie feststellen, dass es für Nullwerte anders funktioniert und so weiter.
Was schneller ist - ich habe nicht vor zu spekulieren - laufen Sie einige hunderttausend Mal in einer engen Schleife auf Ihrer PHP-Version und Sie werden es herausfinden :)
quelle
Ihr Code gibt
isset($array[$i]) || $array[$i] === null
in jedem Fall true zurück, auch wenn der Schlüssel nicht vorhanden ist (und einen undefinierten Indexhinweis liefert). Für die beste Leistung möchten Sieif (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}
quelle
$array[$i] === null
, die ausgeführt wird, ist, wenn $ i im Array vorhanden ist und den Wert NULL hat.