Zjištění příslušnosti do seznamu
Školení, která pořádám
Pokud chceme zjistit, jestli proměnná odpovídá nějakému prvku v seznamu, můžeme to udělat několika způsoby:
<?php
($a == "a" || $a == "b" || $a == "c" || $a == "d");
in_array($a, array("a", "b", "c", "d"));
preg_match('~^(a|b|c|d)$~', $a);
?>
První způsob je dlouhý na zápis a neumožňuje prvky seznamu definovat mimo samotnou podmínku např. v proměnné. Používám ho tedy pouze v případě, že seznam má pouze dva, maximálně tři prvky a $a
není volání funkce. Druhý způsob bych označil za tradiční řešení a třetí způsob je sice poněkud hůře čitelný, ale má tu výhodu, že prvky seznamu mohou být nejen konstantní řetězce, ale i regulární výrazy. Pokud je seznam definován mimo podmínku a je dlouhý, stojí za zvážení uložit prvky jako klíče pole a následně testovat isset($prvky[$a])
, což by mělo být teoreticky rychlejší, protože vypočtení hashe a přímý přístup k prvku je rychlejší než procházení celého pole funkcí in_array. Především v Céčkových zdrojácích je možné vidět také následující způsob, kvůli jeho neúspornosti ale nejsem jeho zastáncem.
<?php
switch ($a) {
case 'a':
case 'b':
case 'c':
case 'd':
;
}
?>
Diskuse
Lukas:
Ja celkem casto pouzivam switch a nevidim v tom nic horsiho nez zapis in_array nebo preg_match.
Z jakeho duvodu nejsi jeho zastancem (switch)?
Mozna proto, ze zabira dost mista.. na druhou stranu bych tipl, ze switch ze vsech reseni bude mozna nejrychlejsi, ne? (coz je ve vetsine pripadu phpka docela putna,ale.. :))
Přesně tak, je s tím hodně psaní a nezdá se mi to ve většině případů přehledné. O rychlostní rozdíly v řádu procent až tak nejde (http://php.vrana.cz/optimalizace-kodu.php), prvořadá je pro mě čitelnost a rozšiřitelnost.
TimeLord:
"switch" je podla mna citatelny viac nez dost a je rychlejsi.
Zalezi samozrejme od sposobu pouzitia, niekde sa viac hodi "switch", inde "if".
Na druhej strane, robit jednoznacne prehlasenie, ze "switch a nic ine" by bolo zase unahlene.
Ak je ten zoznam fakt dlhé, tak to robím takto:
<?php
$list = array(
"a" => 1,
"b" => 1,
"c" => 1,
// ...
);
$isThere = array_key_exists($a, $list);
?>
Je to potom oveľa rýchlejšie, pretože nemusím ísť lineárne O(n) cez pole, ale cez hash a teda konštantne O(1). Opakujem, toto zrýchlenie sa poriadne prejaví až pri veľkých poliach. Rádovo tak od stovky alebo tisícovky položiek.
Ano, je to zmíněné i v článku, pouze místo array_key_exists($a, $list) je použito isst($list[$a]).
Diskuse je zrušena z důvodu spamu.