Nedávno psal Jakub Vrána o tom, jak zjistit příslušnost prvku v seznamu. Zmínil se také o variantě Switch & Case, kterou lze nahradit sérii podmínek if.

switch ($a) {
	case 'a':
	case 'b':
	case 'c':
	case 'd':
	default:
}

Tato konstrukce může být v určitých jazycích a za určitých situací nesmírně rychlá. Bohužel v PHP tomu tak není. V časově kritických rutinách se jí raději vyhněte (tedy této konstrukci, případně PHP vůbec).

Pro rekapitulaci, zjistit příslušnost prvku lze nejméně pěti způsoby:

If série

Nejpomalejší metoda, vhodná tehdy, pokud se „formát“ podmínky případ od případu liší (pokud se neopakuje jen $ch==...). Viz demo č. 1.

if ($ch=="\x00") { /* ... */ continue; }
if ($ch=="\x01") { /* ... */ continue; }
...

Switch & Case

Rychlejší a přehlednější varianta. Viz demo č. 2.

switch ($ch) {
	case "\x00": /* ... */ break;
	case "\x01": /* ... */ break;
	...
}

in_array

Připravíme si pole hodnot a pak už jen testujeme (ne)přítomnost prvku v tomto poli. Viz demo č. 3.

if (in_array($ch, $arr)) {
	// ...
} else {
	// ...
}

array_key_exists

Opět pracuje nad polem, tentokrát se však netestuje přítomnost hodnot, alébrž klíčů (indexů). To je obecně velmi rychlé a tato metoda patří mezi nejrychlejší. Viz demo č. 4.

if (array_key_exists($ch, $arr)) {
	// ...
} else {
	// ...
}

isset

Zoptimalizovaná předchozí varianta. Využívá se jazykové konstrukce isset. Ta je rychlejší než funkce array_key_exists, narozdíl od ní však nedokáže zjistit přítomnost klíče null v poli. Viz demo č. 5.

if (isset($arr[$ch])) {
	// ...
} else {
	// ...
}

Srovnání

Rychlostní srovnání hovoří myslím jasně (větší hodnota znamená delší dobu zpracování).

Graf trvání jednotlivých benchmarků

Optimalizovat kód pro isset je obvykle velmi výhodné. A netýká se to jen polí, lze kupříkladu testovat i délku řetězce (isset($str{14}) namísto strlen($str)>14) atd. Ale to už hraničí s horší čitelností kódu.