457 Stimmen

Was ist der Unterschied zwischen isset() und array_key_exists()?

Wie lassen sich die beiden folgenden Funktionsaufrufe vergleichen?

isset($a['key'])

array_key_exists('key', $a)

1 Stimmen

Jetzt gibt isset FALSE zurück, wenn der Wert null oder leer ist. array_key_exists gibt true zurück, auch wenn der Array-Indexwert leer ist. Zuvor gab isset TRUE zurück, auch wenn der Array-Indexwert leer ist, so dass es verwendet werden kann, um zu prüfen, ob ein Array-Schlüssel existiert.

7voto

Anax Punkte 8732

Funktion isset() schneller ist, prüfen Sie http://www.php.net/manual/en/function.array-key-exists.php#82867

2 Stimmen

Das stimmt, aber man muss bedenken, dass isset() gibt false zurück, wenn die Variable gesetzt ist, aber den Wert von " null "

1 Stimmen

4voto

Peter Krauss Punkte 12277

Ergänzt man (als algebraische Kuriosität) die Antwort von @deceze mit der @ Operator, und die Angabe von Fällen, in denen es "besser" ist, den @ ... Nicht wirklich besser, wenn Sie (kein Protokoll und) Mikro-Performance-Optimierung benötigen:

  • array_key_exists : ist wahr, wenn ein Schlüssel in einem Array existiert;
  • isset : ist true wenn der Schlüssel/die Variable existiert und ist nicht null [ schneller als array_key_exists ];
  • @$array['key'] : ist true wenn der Schlüssel/die Variable existiert und ist nicht ( null oder '' oder 0) ; [so viel langsamer?]

    $a = array('k1' => 'HELLO', 'k2' => null, 'k3' => '', 'k4' => 0);

    print isset($a['k1'])? "OK $a[k1].": 'NO VALUE.'; // OK print array_key_exists('k1', $a)? "OK $a[k1].": 'NO VALUE.'; // OK print @$a['k1']? "OK $a[k1].": 'NO VALUE.'; // OK // outputs OK HELLO. OK HELLO. OK HELLO.

    print isset($a['k2'])? "OK $a[k2].": 'NO VALUE.'; // NO print array_key_exists('k2', $a)? "OK $a[k2].": 'NO VALUE.'; // OK print @$a['k2']? "OK $a[k2].": 'NO VALUE.'; // NO // outputs NO VALUE. OK . NO VALUE.

    print isset($a['k3'])? "OK $a[k3].": 'NO VALUE.'; // OK print array_key_exists('k3', $a)? "OK $a[k3].": 'NO VALUE.'; // OK print @$a['k3']? "OK $a[k3].": 'NO VALUE.'; // NO // outputs OK . OK . NO VALUE.

    print isset($a['k4'])? "OK $a[k4].": 'NO VALUE.'; // OK print array_key_exists('k4', $a)? "OK $a[k4].": 'NO VALUE.'; // OK print @$a['k4']? "OK $a[k4].": 'NO VALUE.'; // NO // outputs OK 0. OK 0. NO VALUE


PS: Sie können diesen Text ändern/korrigieren/ergänzen, es ist ein Wiki.

10 Stimmen

Hinweis: Es ist niemals besser, die @ Betreiber.

0 Stimmen

@Bracketworks, "Nie"(?) ist ein starkes Wort für Wissenschaft oder Programmierung, sogar für Einstein oder Newton... Für mich ist es nur ein kleines Leistungsproblem. Ich benutze es, weil es kurz ist, um zu sagen $x = @$_GET['x']; als $x = array_key_exists('x',$_GET)? $_GET['x']: ''; . Siehe diese Frage um selbst zu entscheiden.

3 Stimmen

Nein, es ist wirklich "nie" besser, die @ Operator, insbesondere bei der Dereferenzierung von Arrays. isset() o array_key_exists() die Absicht des Codes zu kommunizieren und nicht einen bereits von Natur aus missbrauchbaren Operator zu missbrauchen. Natürlich müssen Sie mich nicht überzeugen, aber wenn Sie ein Beispiel nennen können, in dem der @ Operator messbar leistungsfähiger ist oder die Absicht des Codes prägnanter vermittelt als eine Alternative, ändere ich gerne meinen Ton.

0voto

TNi Punkte 14868

Die beiden sind nicht genau dasselbe. Ich kann mich nicht mehr an die genauen Unterschiede erinnern, aber sie sind sehr gut beschrieben in Was ist schneller und besser, um festzustellen, ob ein Array-Schlüssel in PHP existiert? .

Der allgemeine Konsens scheint zu sein, wann immer es möglich ist, isset zu verwenden, weil es ein Sprachkonstrukt ist und daher schneller ist. Die Unterschiede sollten jedoch oben dargelegt werden.

1 Stimmen

Der Geschwindigkeitsunterschied zwischen den beiden sollte vernachlässigbar sein.

1 Stimmen

Bei großen Schleifen bin ich mir da nicht so sicher. Vielleicht haben Sie trotzdem recht, und ich müsste einen Benchmark durchführen, aber kleine Einsparungen können sich in Schleifen summieren. Für die meisten praktischen Anwendungen ist der Unterschied, wie Sie sagen, vernachlässigbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X