Chyba v procházení polí

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

PHP 5.2.1 obsahuje chybu při kombinování různých způsobů pro procházení pole. Jde o to, že po projití pole konstrukcí foreach se přesune interní ukazatel pole, takže např. funkce key nevrátí klíč prvního prvku, ale null.

Chyba dosud není opravena, přestože vydání verze 5.2.2 je na spadnutí, proto stojí za zvážení sáhnout do vlastního kódu a po průchodu pole volat funkci reset.

Jakub Vrána, Řešení problému, 3.5.2007, diskuse: 5 (nové: 0)

Diskuse

Petr:

Tak 5.2.2 byla vydaná, ale v seznamu změn o opravě tohoto není zmínka. JSem jen slepý nebo to tam není opraveno?

ikona Jakub Vrána OpenID:

Chyba skutečně není opravena. Proto jsem v článku také upozornil na to, že stojí za zvážení upravit vlastní kód.

Pavel Gloss:

Tak tahle chyba mi nedávno pěkně zkomplikovala život. Po nasazení eshopu na novější verzi php (ano 5.2.1), se mi některé smyčky zacyklily.

Nevěděl jsem čím to je, ale podezříval jsem kompilátor resp. interpret. //ikdyž nám ve škole vtloukají do hlavy, že kompilátor je bezchybný a chyby dělá jenom programátor. LOL.

// workaround: pouziti while
  public static function findKeyInArray($key, $array) {
    reset($array);
    while (list($k, $v) = each($array)) {
      if ($k == $key)
        return true;
    }
      return false;   // not found
  }

qwe:

Proč tak složitě, nestačí fce array_key_exists?

echo:

Zrejme preto, ze je paranoidne nedovercivy.Radsej si napisal vlastnu funkciu :p

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 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.