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 a 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.

Ha nem adsz meg egy kulcsot, a PHP veszi az egész indexek közül a legnagyobbat, és ennél egyel nagyobb indexű elemet hoz létre. Az egészek lehetnek negatívak is, de ez igaz a negatív indexekre is. Ha például a legnagyobb index -6, akkor az következő, új index -5. Ha még nincs egész értékkel megadott index, az új kulcs 0 (nulla) lesz. Ha olyan kulcsot adsz meg, ami már a tömb eleme, a korábbi elem felülíródik.

A logikai true érték integer típusúvá alakítva a 1 indexnek felel meg. A false integer típusúvá alakítva a 0 indexnek felel meg. A NULL üres stringgé konvertálódik, amit kulcsként használva létrehoz egy üres string kulcsú bejegyzést a tömbben, de ez nem azonos az üres szögletes zárójelek használatával ([] -- új elemet fűz a tömb végéhez).

Tömbök és objektumok nem használhatók kulcsként. Ha ez mégis megtörténik, akkor figyelmeztetést kapunk: Illegal offset type.

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.

Megjegyzés: Az unset() függvénnyel lehet egy értéket a tömbből törölni. Figyelj arra, hogy a tömb nem lesz újraindexelve!

$a = array( 1 => 'egy', 2 => 'kettő', 3 => 'három' );
  unset( $a[2] );
  /* ennek eredményeképpen $a így fog kinézni:
     $a = array( 1=>'egy', 3=>'három');
     és NEM így:
     $a = array( 1 => 'egy', 2 => 'három');
  */

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[bigyo] forma?

Minden string típusú kulcsot idézőjelek vagy aposztrófok közé kell tenni tömbbeli elemre történő hivatkozásnál, például: $ize['bigyo'] és nem $ize[bigyo]. Vajon miért nem jó $ize[bigyo] alak? Talán láttad ezt a szintaxist régi PHP programokban:

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

Ez hibás, és mégis működik. Akkor mégis miért nem jó? Azért, mert a bigyo itt valójában egy nem definiált állandót jelöl, és nem a 'bigyo' sztringet (figyelj az aposztrófokra). A későbbi PHP verziókban már előfodulhatnak olyan előre definiált állandók, amelyeknek ugyanaz lesz a neve, mint ami a saját kódodban sztringként szerepel. Azért működik, mert ezeket a nem definiált állandókat a PHP a nevükkel azonos tartalmú sztringgé konvertálja. A szintaxis részben is már 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.

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.

Megjegyzés: 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, valahányszor olyan indexre történik hivatkozás, ami nem definiált. (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 7-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 // 0. indexű/kulcsú
                  , 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 7-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 7-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 7-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 7-8. Felöltés valós adatokkal

// egy tömb felöltése a <link linkend="ref.dir">könyvtárban</link> 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 7-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 7-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"
                                     )
                );