Személy szerint már sokszor jártam úgy, hogy egy eredményt, ami várhatóan egy tömb volt be kellett járja. Ilyen esetekben általában meg szoktuk vizsgálni, hogy a tömbnek vannak-e elemei. Ez nem a legelegánsabb megoldás, hisz egy fölösleges if -et jelent, s ez nem mindig jelent megoldást.
Mindezt egy egyszerű kis típuskonverzióval meg ki tudjuk kerülni. Így a foreach nem fog null tömbre hivatkozni.
foreach ((array) $nem_array as $kulcs => $ertek) { print "Kulcs $kulcs, Ertek $ertek\n"; } |
Ebben az esetben a php nem fog egy csúnya hibaüzenetet küldeni, ehelyett nem járja be a tömböt, hisz az egy üres tömb lesz.
Szerkesztve – BlackY: Ahogy azt Zogmund írja hibát (pontosabban E_WARNING, vagyis figyelmeztetés) akkor jelez az értelmező, ha az iterálandó érték nem array vagy egy, az Iterable interfészt implementáló osztály példánya (PHP 5). És az ilyen castolások valóban később nehezen megtalálható hibákat eredményezhetnek, ezért inkább a következőt javaslom:
assert('is_array($valtozo) || $valtozo instanceof Iterable'); /* Ez fejlesztés közben jön jól, ha $valtozo nem iterálható megszakítja a scriptet, és azonnal tudjuk, hogy mi volt a gond */ $valtozo = is_array($valtozo) ? $valtozo : array(); /* Ez pedig már az éles oldalon, ahol például felhasználótól érkező adaton akarunk végigiterálni (pl.: checkboxok - ha egyet sem jelöl be, akkor nemhogy nem tömböt, de még értéket sem kapunk) */ |
És ha az olvashatatlanságig el akarjuk csúnyítani a kódunkat:
foreach( (is_array($tomb) ? $tomb : array()) as $kulcs => $ertek) |
Továbbá egy megjegyzés: ha valamiről biztosan tudjuk, hogy tömbnek kell lennie (vagy tömbnak VAGY nullnak), akkor használhatjuk (PHP 5.1-től) a Type hinting megfelelő részét:
function akarmi(array $tomb) {} /* $tomb biztosan array típusú, különben futási idejű hiba (E_ERROR) keletkezik */ function akarmi(array $tomb = null) {} /* $tomb vagy array típusú, vagy null érték, egyéb esetben E_ERROR keletkezik és megáll a script futása */ |
Ha üres a tömb, akkor a foreach nem ad hibát, ellenben ha nem tömböt kapsz akkor van a probléma (bár gondolom erre gondoltál, mert a példakódból ez jön le, csak a szövegben nem ez van :)), ilyenkor ez tényleg kényelmes, jó megoldás.
De amíg nem „éles a kód”, addig nem jó ezt használni, mert egy csomó bug -ot „elnyelhet”.