@t[A PHP-tömb]~~META:date created = 2007-03-18~~
Lássuk mármost, hogy mit tudnak a tömbök a [[http://php.net|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.
@blogf[!]