Performance: in_array vs. isset vs. array_key_exists
Neulich wurde ich von einem Kollegen darauf aufmerksam gemacht, wie wenig Performance die Funktion in_array() doch bietet. Dass diese Funktion nicht die „hochperformanteste” ist, war mir schon klar, doch wie langsam/schnell ist sie im Vergleich zu anderen Funktionen?
In diesem Test möchte ich die drei Funktionen isset(), array_key_exists() und in_array() testen und beweisen, dass die Funktion in_array() nicht immer die klügste Wahl ist. Anhand eines Beispiels möchte ich euch zeigen, dass man nicht immer die Funktion in_array() benutzen muss.
Performancevergleich – in_array vs. isset vs. array_key_exists
Mal angenommen, wir haben folgendes Array:
array("Apfel", "Birne", "Pfirsich");
Um nun zu testen, ob das Array ein Element “Apfel” enthält, würden wir für gewöhnlich folgende Abfrage machen:
if (in_array("Apfel", $array))
An diese Stelle möchte ich euch nun auf die Grafik aufmerksam machen. Wie man unschwer erkennen kann, steigt die Laufzeit für die Funktion in_array() exponentiell an mit zunehmender Menge an Elementen.

Die unten stehende Tabelle enthält nochmal die absoluten Zahlen der Messergebnisse.
Array Size | in_array in ms | array_key_exists in ms | isset in ms |
1 | 7 | 6 | 5 |
10 | 9 | 6 | 4 |
50 | 21 | 6 | 4 |
100 | 35 | 6 | 4 |
1.000 | 334 | 6 | 4 |
5.000 | 1.642 | 6 | 5 |
15.000 | 5.228 | 6 | 4 |
50.000 | 34.623 | 8 | 6 |

Und hier nun das Skript, mit welchem die Testergebnisse durchgeführt wurden.
<?php $array = array(); for ($i=0; $i<50000; $i++) $array[$i] = rand(0,1000000); $time1 = microtime(true); for ($i=0; $i<10000; $i++) in_array(rand(0,100000),$array); echo "in_array(): ".round((microtime(true)-$time1)*1000, 0)."ms\n"; $time2 = microtime(true); for ($i=0; $i<10000; $i++) array_key_exists(rand(0,100000), $array); echo "array_key_exists(): ". round((microtime(true)-$time2)*1000, 0)."ms\n"; $time3 = microtime(true); for ($i=0; $i<10000; $i++) isset($array[rand(0,100000)]); echo "isset(): ". round((microtime(true)-$time3)*1000, 0)."ms\n"; ?>