Porovnávání polí

Školení, která pořádám

V PHP lze porovnávat jakékoliv typy, což je popsáno v dokumentaci. Když jsem tabulku podle zdrojových kódů sestavil, tak lidem přišla nějaká divná hlavně proto, že se v ní některé typy opakují. Klíčem pro její pochopení je uvědomit si, že se čte shora dolů. Takže když jsou oba operandy string, porovnají se hned podle prvního řádku, když je jeden string a jeden number, tak se porovnají až podle čtvrtého řádku.

Nejzáludnější je porovnávání polí, kde jsou pravidla tato:

  1. Pokud má jedno pole méně prvků, tak je menší. Dále se postupuje po jednotlivých prvcích:
  2. Pokud klíč porovnávaného prvku v druhém poli není, tak jsou pole neporovnatelná (jakékoliv porovnání vrátí false).
  3. Pokud je hodnota prvku menší, tak je celé pole menší, jinak se pokračuje s dalším prvkem.

Z algoritmu je patrné, že pokud pole obsahují klíče v různém pořadí, tak záleží na tom, které pole se bude procházet. Člověk by čekal, že to bude vždy to vlevo, ve skutečnosti to je ale to „menší“, protože $a > $b se ve skutečnosti vyhodnocuje jako $b < $a). V PHP 6 se to ale možná změní.

<?php
// neexistující klíč - neporovnatelné
$a = array(0);
$b = array(1 => 1);
var_dump($a < $b); // false
var_dump($a > $b); // false

// prochází se "menší" pole - paradox
$a = array(0, 1);
$b = array(1 => 0, 0 => 1);
var_dump($a < $b); // true
var_dump($a > $b); // true
?>

Z uvedených příkladů je patrné, že porovnávání polí se může chovat hodně zvláštně. I když se smíříme s neporovnatelností polí s rozdílnými klíči (která se dá pochopit), zůstává zde procházení „menšího“ pole způsobující uvedený paradox, které se navíc v PHP 6 možná změní. Pokud ke změně dojde, vznikne jiný paradox: $a < $b nebude nutně vracet stejný výsledek jako $b > $a.

Jakub Vrána, Výuka, 14.4.2006, diskuse: 0 (nové: 0)

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.