Lássuk mármost, hogy mit tudnak a tömbök a PHP-ben, amit BASIC-ben nem. Mindössze három dolgot, de ez a három azt okozza, hogy a PHP- és a BASIC-tömb ég és föld.
Az első dologgal röviden végzünk: a PHP-beli tömb hatalmas mennyiségű adatot tárolhat. A régebbi nyelvekben bosszantó korlátozások voltak, amik a PHP-ben nincsenek. Egyszerűen akkora lehet a tömbünk, amekkorát akarunk.
A második: a PHP-s tömbnek nem indexei vannak, hanem kulcsai, amik nemcsak számok lehetnek, hanem szövegek is. Ami azt illeti, egyes modern BASIC-nyelvjárásokban van valami hasonló, de a hasonlóság csak felszínes. Nézzük először, mit tud a BASIC. Vegyük megint elő a sakkprogramot. Lehet, hogy kényelmesebb, ha a bábuk helyét nem egy, hanem két adattal határozzuk meg, a sorral és a vonallal. Azonkívül érdemes lehet tárolni további adatokat is, például hogy támadják és védik-e a bábut, hogy ő hány mezőt támad, hogy lépett-e már (király és bástya esetén fontos) stb. Nekünk az most mindegy, hogy mik az adatok, amiket egy-egy figuráról számon kell tartani. Lényeg, hogy egy csomóan vannak.
Modern nyelvjárást használó programozó ilyenkor rekordtömböt csinál. Készít egy rekordleírást, valami ilyesmit:
TYPE babutipus sor AS INTEGER vonal AS INTEGER tamad AS INTEGER tamadjak AS INTEGER lepett AS INTEGER
stb., és csinál egy ilyen típusú tömböt:
DIM babu(32) AS babutipus
. Ettől kezdve babu(5).sor azt a sort jelöli, ahol az 5. bábu áll, babu(12).lepett azt mondja meg, hogy a 12-es bábu lépett-e már, és így tovább. A módszer kényelmes, de vannak hiányosságai. Nem tehetjük meg, hogy egy változóba beletesszük mondjuk a tamad szót, aztán ezt a változót adjuk oda a BASIC-nek, hogy ebből olvassa ki, melyik adatra vagyunk kíváncsiak. A zárójelek között állhat változó, a pont után nem. És nem is bővíthetjük a szerkezetet programfutás közben. Át kell írni a bemutatott TYPE utasítást.
A PHP sokkal többet tud. Nem kell előre meghatározni a tömb szerkezetét, az mindig a pillanatnyi szükségletek szerint alakulhat, és bármik lehetnek a kulcsai. Próbaképpen csináljunk egy tömböt PHP-ben.
$kiraly = array( 'szín'=>'világos', 'sor'=>1, 'vonal'=>'e', 'támadják'=>0);
A trükk a => jel, vagyis egy nyíl. A nyíl bal oldalán a kulcs áll, a jobb oldalán a kulcshoz tartozó érték. Ha most ezt írom:
$kiraly['szín']
, ez a „világos” szót fogja jelenteni, mert ehhez a kulcshoz ez az érték tartozik. Ha csinálok egy változót, mondjuk
$micsoda = 'szín';
és aztán ezt írom:
$kiraly[$micsoda]
, az ugyanazt jelenti. Így végig lehet sétálni a tömb összes elemén, akár számok a kulcsaik, akár szövegek.
A tömb bármikor kaphat új kulcsokat. Ha például ezt írom:
$kiraly['lépett'] = 'igen';
akkor a tömbben létrejön egy új kulcs a hozzá tartozó értékkel.
A harmadik vívmány, ami nélkül az előző kettő nem sokat érne, az, hogy a tömb bármelyik eleme lehet tömb is. Tartalmazhat egy csomó tömböt, amik bármelyike további tömböket, azok még további tömböket, és így tovább. Például az iménti $kiraly tömböt bele lehet tenni egy $babu tömbbe, ami az összes báburól tartalmaz egy-egy ilyen adatsort. De talán jobb itt egy másik példa.
Induljunk ki egy DVD-filmből.
$film = array( 'cím'=>'Csillagok háborúja', 'cikkszám'=>123456);
Legyen több ilyen filmünk:
$filmek = array( 619=>array( 'cím'=>'Zabriskie Point', 'cikkszám'=>623756), 766=>array( 'cím'=>'Ben Hur', 'cikkszám'=>672316), 872=>array( 'cím'=>'Aranypolgár', 'cikkszám'=>167233), );
Ezek persze csak részletek. Most $filmek[872] egy tömböt fog jelenteni az Aranypolgár össszes adatával, $filmek[872]['cím'] pedig konkrétan ennek a filmnek a címét. Most tegyük föl, hogy ez nem volt más, mint egy DVD-üzlet nyilvántartása, mondjuk Pécsett, és a cégnek több városban is van boltja. Ezért az egész pécsi nyilvántartást betesszük egy nagyobb tömbbe:
$boltok['Pécs'] = $filmek;
Most $boltok['Pécs][766]['cím'] azt jelenti: Ben Hur, $boltok['Szeged'][766]['cím'] viszont esetleg azt, hogy Pokoli torony, mert abban a boltban ez a 766. film.
De lehet, hogy a cég kibővíti üzletkörét. Akkor az egész DVD-nyilvántartást betehetjük egy nagyobb tömbbe:
$uzlet['DVD'] = $boltok;
és lesz $uzlet['tévé'] meg $uzlet['számítógép'] is. Esetleg teljesen más szerkezettel, mert a készülékeknek nincsen címük, viszont van típusszámuk, ezzel szemben a szorgalmas kollégák a DVD-k adatait tároló tömbben elhelyezték a film készítőinek adatait, a szereplők névsorát külön tömb tartalmazza. A tévéknek van képernyőméretük, a számítógépeknek viszont memóriakapacitásuk. Nem gond. A végén ilyenek jöhetnek ki: $uzlet['DVD']['Miskolc'][612]['szereplők'], ami azt a tömböt jelenti, ami egyik miskolci filmünk szereplőit sorolja föl, vagy $uzlet['tévé']['Győr'][232]['típus'], ami egy Győrben árult tévénk típusát közli. És lehet, hogy a $uzlet['tévé']['Pécs'] üres tömböt ad eredményül, mert a pécsi üzletünkben nem árulunk tévéket.