@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[!]