Tömbök

A PHP tömbjei rendezett leképezéseket valósítanak meg. A leképezés értékeket rendel kulcsokhoz. Ez a típus sokféleképpen használható, mint egy hagyományos tömb, egy lista (vektor), hash tábla, szótár, kollekció, halmaz, sor, és mások. Mivel egy újabb PHP tömb szerepelhet értékként, könnyen szimulálhatsz fákat.

Az említett struktúrák leírása ezen kézikönyv kereteibe nem fér bele, de legalább egy példát mutatunk mindegyikre. További információkért külső forrásokat kell igénybe venned erről az igen széles témáról.

Szintaxis

Tömb létrehozása az array() nyelvi elemmel

Egy array (tömb) típusú változót az array() nyelvi elemmel tudsz létrehozni, amely számos vesszővel elválasztott kulcs => érték párt vár.

Egy kulcs vagy egy nemnegatív integer (egész szám) vagy egy string. Ha a kulcs egy szabványos formában megadott nemnegatív egész szám (integer), az megfelelő módon kerül értelmezésre. Konkrétabban pl. a '8' a 8 egész szám lesz, míg a '08' a '08' string.

Az érték bármi lehet.


array( [kulcs =>] érték
     , ...
     )
// a kulcs vagy egy string vagy egy nemnegatív integer (egész szám)
// az érték bármi lehet
      

Létrehozás/módosítás a szögletes zárójeles formával

Meglévő tömbök is módosíthatóak konkrét elemek megadásával.

Ezt úgy tudod megtenni, hogy a tömb neve után szögletes zárójelekben megadod a kulcsot, amit módosítani szeretnél. Ha elhagyod a kulcsot, és csak egy üres szögletes zárójel párt ("[]") adsz meg a változó neve után, a tömb végére illeszthetsz elemet.

$tomb[kulcs] = érték;
$tomb[] = érték;
// a kulcs vagy egy string vagy egy nemnegatív integer (egész szám)
// az érték bármi lehet
      
Ha a $tomb nem létezik, ezzel létrejön. Tehát ez egy újabb alternatíva tömbök létrehozására. Ha módosítani szeretnél egy elemet, rendelj hozzá új értéket. Ha meg szeretnél szüntetni egy kulcs/érték párt, használd az unset() függvényt.

Hasznos függvények

Jónéhámy függvény létezik a tömbökkel való munka megkönnyítésére. Lásd a tömb függvények című részt.

A foreach vezérlési szerkezet kifejezetten a tömbök számára jött létre. Egy egyszerű módszert ad tömbökön való végiglépkedésre.

Mit tehetünk, és mit nem a tömbökkel

Miért nem jó az $ize[valami] forma?

Talán láttad ezt a szintaxist régi PHP programokban:


$ize[valami] = 'ellenség';
echo $ize[valami];
// stb.
       

Ez hibás, és mégis működik. Akkor mégis miért nem jó? Az ok az, ami már a szintaxis részben is olvasható volt, hogy a szögletes zárójelek ('[' és ']') között egy kifejezésnek kell állnia. Ez azt jelenti, hogy írhatsz ehhez hasonló dolgokat is:


echo $tomb[ ize(true) ];        
       

Ez a példa bemutatja, hogyan használhatsz függvény visszatérési értéket tömbindexként. A PHP úgyszintén ismeri a konstansokat. Bizonyára hallottál már az E_* konstansokról.


$hiba_leiras[E_ERROR]   = "Fatális hiba történt";
$hiba_leiras[E_WARNING] = "A PHP figyelmeztetést adott";
$hiba_leiras[E_NOTICE]  = "Informális megjegyzés";
       

Figyeld meg, hogy az E_ERROR egy érvényes azonosító, mint a valami az előző példában. De a legutóbbi példa ugyanaz, mintha ezt írnánk:


$hiba_leiras[1] = "Fatális hiba történt";
$hiba_leiras[2] = "A PHP figyelmeztetést adott";
$hiba_leiras[8] = "Informális megjegyzés";
       

mivel az E_ERROR konstans értéke 1, stb.

Akkor hogyan lehet mégis, hogy az $ize[valami] működik? Nos, azért, mert valami a szintaxisa következtében egy konstanst határoz meg. Azonban ebben az esetben valami nevű konstans nem létezik. A PHP ebben az esetben azt feltételezi, hogy a valami karaktersorozatra gondolsz ("valami"), csak elfejeltetted kitenni az idézőjeleket.

De miért nem jó ez?

Valamikor a jövőben a PHP fejlesztői hozzáadhatnak egy új konstanst vagy kulcsszót a nyelvhez, és akkor bajba kerülsz. Például jelenleg sem használhatóak az empty és default szavak, mivel ezek speciális kulcsszavak.

Ha ezek az érvek nem győznek meg: ez a szintaxis egyszerűen nem javasolt, és bármikor megszűnhet működni.

Tipp: Ha az error_reporting beállítást E_ALL értékre állítod be, látni fogod, hogy a PHP figyelmeztetéseket generál, ha ezt a kunstrukciót használod. Ez ugyanígy érvényes minden más nem javasolt 'szolgáltatásra'. (Add az error_reporting(E_ALL); sort a programod elejéhez).

Megjegyzés: Idézőjeles stringekben, egy másik szintaxis érvényes. Lásd a változók behelyettesítése című részt további részletekért.

Példák

A tömb típus a PHP-ben nagyon sokoldalú, ezért összegyűjtöttünk néhány példát, hogy megmutassuk a tömbök erejét.


// ez
$a = array( 'szín' => 'piros',
            'íz'   => 'édes',
            'alak' => 'kerek',
            'név'  => 'alma',
                      4        // 0 lesz a kulcsa
          );

// teljesen megyezik ezzel
$a['szín'] = 'piros';
$a['íz']   = 'édes';
$a['alak'] = 'kerek';
$a['név']  = 'alma';
$a[]       = 4;        // 0 lesz a kulcsa

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// a következő tömböt adja: array( 0 => 'a' , 1 => 'b' , 2 => 'c' )
// vagy egyszerűen: array('a', 'b', 'c')

       

Példa 6-4. Az array() használata


// Tömb, mint tulajdonság hozzárendelés
$map = array( 'verzió'     => 4
            , 'rendszer'   => 'Linux'
            , 'nyelv'      => 'angol'
            , 'short_tags' => true
            );
            
// szigorúan számokat tartalmazó tömb
$tomb = array( 7
             , 8
             , 0
             , 156
             , -10
             );
// ez ugyanaz, mint array ( 0 => 7, 1 => 8, ...)

$valtogatas = array(         10 // kulcsa 0
                  , 5    =>  6
                  , 3    =>  7
                  , 'a'  =>  4
                  ,         11 // kulcsa 6 (a legnagyobb egész kulcs 5 volt)
                  , '8'  =>  2 // kulcsa 8 (egész!)
                  , '02' => 77 // kulcsa '02'
                  , 0    => 12 // a 10 értéket felülírjuk 12-vel
                  );
                  
// üres tömb
$ures = array();

     

Példa 6-5. Kollekció


$szinek = array('piros','kék','zöld','sárga');

foreach ( $szinek as $szin ) {
    echo "Szereted a(z) $szin színt?\n";
}

/* kimenete:
Szereted a(z) piros színt?
Szereted a(z) kék színt?
Szereted a(z) zöld színt?
Szereted a(z) sárga színt?
*/
     

Figyelj arra, hogy jelenleg közvetlenül nem lehet módosítani a tömb elemeinek értékét ezzel a ciklussal. A problémát a következőképpen tudod megkerülni:

Példa 6-6. Kollekció


foreach ( $szinek as $kulcs => $szin )
{
    // nem működik (nem módosítja a tömböt):
    //$szin = strtoupper($szin);
    
    // működik (módosítja a tömböt):
    $szinek[$kulcs] = strtoupper($szin);
}
print_r($szinek);

/* kimenete:
Array
(
    [0] => PIROS
    [1] => KÉK
    [2] => ZÖLD
    [3] => SÁRGA
)
*/
      

Ebben a példában egy egytől számozott tömböt készítünk.

Példa 6-7. Egytől kezdődő index


$elsonegyed  = array(1 => 'Január', 'Február', 'Március');
print_r($elsonegyed);

/* kimenete:
Array 
(
    [1] => 'Január'
    [2] => 'Február'
    [3] => 'Március'
)
*/        
      

Példa 6-8. Felöltés valós adatokkal


// egy tömb felöltése a könyvtárban található filenevekkel
$konyvtar = opendir('.');
while ($filenev = readdir($konyvtar)) {
    $filenevek[] = $filenev;
}
closedir($konyvtar); 
     

A tömbök rendezettek. A sorrendet számos függvénnyel megváltoztathatod. Lásd a tömb függvények című részt további információkért.

Példa 6-9. Tömbök rendezése


sort($filenevek);
print_r($filenevek);
     

Mivel a tömb egy értéke bármi lehet, értékként akár egy másik tömböt is megadhatsz. Ilyen formában készíthetsz rekurzív vagy többdimenziós tömböket.

Példa 6-10. Rekurzív és többdimenziós tömbök


$gyumolcsok = array ( "gyümölcsök"  => array ( "a" => "narancs"
                                     , "b" => "banán"
                                     , "c" => "alma"
                                     )
                , "számok" => array ( 1
                                     , 2
                                     , 3
                                     , 4
                                     , 5
                                     , 6
                                     )
                , "lyukak"   => array (      "első"
                                     , 5 => "második"
                                     ,      "harmadik"
                                     )
                );