A PHP-tömb

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.

»»»»»»