9.12. Tömbök, tömbkezelő függvények

Default book

A PHP-ban a tömbök furcsa szerzetek. Hasonlítanak a C# directory típusára vagy más nyelvek enumeration típusára, illetve programozás elméletben listáknak hívjuk az ilyen szerkezeteket. A PHP tömbök belső tárolása listaszerűen történik, de az egyes elemekre lehet hivatkozni a tömbelem indexével is. Ha nem írunk indexet egy tömbelem létrehozásakor, akkor a PHP automatikusan 0.-val kezdődő sorszámokkal indexeli az elemeket. Ilyen látható az alábbi példában is.

A tömb elemek típusa teljesen tetszőleges lehet. (Ez onnan eredeztethető, hogy a PHP-t eredetileg HTML oldalak kezeésére hozták létre, ahol pedig minden stringként kezelendő.) Ilyen módon az elemek kevert típusúak, sőt egy tömbelem lehet egy tömb is. Így jöhet létre több dimernziós tömb is! Ha egy tömb végére új elemet akarunk hozzáfűzni, akkor úgy tehetjük meg, hogy nem adjuk meg az indexét az elemnek, ilyen módon létrejön az új elem.

Tömb létrehozása

<?php 
  //üres tömb létrehozása => nincsen benne elem
  $a = array();
  $b = []; // Üres tömb létrehozása másképpen
  //Tömb létrehozása elemekkel
  $b = array('a',"bb",999, FALSE, TRUE, Array(1,2,3,4,5) );
  // A tömb végére egy plusz elemet fűzök hozzá
  $b[] = "Új elem";
  $a[0] = 123;
  $a[1] = 1.33;
  $a[2] = -365;
  $a[3] = "Pista";
?>

Tömb elemeinek kiiratása

A tömbök elemeit általában for ciklussal tudjuk kiiratni. Ehhez szükséges tudnunk az elemek számát. majd a for ciklussal egyesével végigmegyek a tömb elemein. Az alábbi példán a létrehozott és feltöltött $a tömb elemeit iratjuk ki. A count($tomb) visszaadja a tömb elemszámát!

<?php 
  $a[0] = 123;
  $a[1] = 1.33;
  $a[2] = -365;
  $a[3] = "Pista";
  $max = count($a); // A tömb elemszámát adja vissza a függvény
  for($i = 0; $i < $max; $i++){
     echo $a[$i];
     echo "<br>";
  }
?>

Ezt a példát akármelyik programozási nyelven leírhattuk volna hasonlóan. Ha a tömb N. indexű eleme után értéket adunk az N+2-iknek vagyis kihagyunk egy vagy több indexet, akkor a közte lévő elemek nem jönnek létre, tehát a kiíratásnál problémáink lesznek. Vagyis ha a tömb "lyukas", akkor bajban vagyunk.

Asszociatív tömbök

Az eddigi példákban a tömb elemeinek indexe mindig egész szám, de a tömbelemek indexei is lehetnek tetszőleges felsorolható értékek, azaz integer, string.

<?php 
  //Asszociatív tömb létrehozása elemekkel
  $d = array("a" =>'Első',"b" => "Második", "c"=>"Harmadik elem");
  // A tömb végére egy plusz elemet fűzök hozzá
  print_r($d);
?>

A tömbelemek elérése egyesével egyszerű, ha tudjuk a tömbelem indexét, például: echo $d["b"];

Egyszerű PHP utasítás a print_r() függvény, amely megjeleníti olvasható formában a neki paraméterül átadott tömb elemeit. Ez csak fejlesztés közben tesztelésre szokás használni.

Ha sok elemünk van és nem feltétlenül tudjuk az indexeket, akkor programban a foreach ciklust használhatjuk. Ebben az esetben a ciklus a megadott tömb elemein egyesével végigmegy. A tömb elemei a létrehozás sorrendjében lesznek feldolgozva:

<?php 
  //Asszociatív tömb létrehozása elemekkel
  $d = array("a" =>'Első',"b" => "Második", "c"=>"Harmadik elem");
  // A tömb elemeinek listája
  foreach($d AS $e){
    echo "érték: ".$e."<br>";
  }
  // A tömb kulcsait és elemeit is kiírja
  foreach($d AS $i => $f){
    echo "index: ".$i;
    echo "<br>";
    echo "érték: ".$f."<br>";
  }
?>

A foreach ciklus két módon használható. A fenti példa egyszerűbb esetében az $e változó csak az aktuális tömbelem értékét kapja meg, míg a második példában az $i változó az aktuális indexet és az $f változó az aktuális értéket veszi fel. Én általában a második szintaktikát használom, mert az indexekre is gyakran van szükség.

Több dimenziós tömbök

A fentieket tovább gondolva és értelmezve a több dimenziós tömbök is értelmezhetők.

<?php 
  //Két dimenziós tömb létrehozása
  $t[0][0] = 10;
  $t[0][1] = 20;
  $t[0][2] = 30;
  ...
  // A tömb elemeinek listája
  for ($i = 0; $i< count($t); $i++){
    for($j = 0; $j< 3;$j++){
       echo $t[$i][$j];
    }
  }
?>

Ha a több dimenziós tömb tartalmaz numerikus és string indexeket is, azaz asszociatív tömb, akkor két foreach ciklus segítségével lehet bejárni a tömbelemeket, ahogyan az alábbi példában is látszik.

<?php 
  //Két dimenziós tömb létrehozása
  $t[0][0] = 10;
  $t["p0"]["a"] = 20;
  $t["p0"]["b"] = 30;
  ...
  // A tömb elemeinek listája
  foreach ($t AS $i => $e){
    foreach($e AS $j =>$f){
       echo $f;
    }
  }
?>

Néhány tömbkezelő függvény

Az alábbiakban néhány, általunk fontosnak tartott tömbkezelő függvényt mutatunk be.

  • count() - Egy tömb elemeinek száma / sizeof() - ugyanezt jelenti => alias
  • array_merge() - két vagy több tömb tömb összekombinálása. A tömbelemek sorrendje nem marad meg.
  • array_intersect() - két tömb közös része (metszete)
  • array_diff() - két tömb különbsége

Tömbök rendezése

Függvény neveA rendezés alapjaAsszociatív kulcsokat kezeli-e?a rendezettség irányaEllentétes / kapcsolt függvény
array_multisort()értékasszociatív tömböt is rendez, numerikus tenmaz első tömb vagy rendezési opcióarray_walk()
asort()értékigennövekvő sorrendarsort()
arsort()értékigencsökkenő sorrendasort()
krsort()kulcsigencsökkenő sorrendksort()
ksort()kulcsigennövekvő sorrendasort()
natcasesort()értékigentermészetes, kis- és nagybetű érzéketlennatsort()
natsort()értékigentermészetesnatcasesort()
rsort()értéknemhcsökkenő sorrendsort()
shuffle()értéknemvéletlen (keverés)array_rand()
sort()értéknemlnövekvő sorrendrsort()
uasort()értékigenuser defineduksort()
uksort()kulcsigenuser defineduasort()
usort()értéknemuser defineduasort()

array_push($elem) - a tömb végéhez fűz egy elemet.

array_pop() - a tömb utolsó elemét adja vissza és kiveszi az utolsó elemet a tömbből.

 
Megjegyzések:
 
  • Az asszociatív tömbök esetében azonban figyelemmel kell lenni arra, hogy ilyen tömb elemeit kizárólag a meghatározott indexértékkel érhetjük el, a tömbelem sorszámával nem. Ennek rendkívül egyszerű az oka. Az egyszerű sorszámozott tömb is asszociatív tömb, ahol a tömbindex maga a sorszám. Sőt egy tömbön belül keverhetjük is a sorszámozott és az indexelt elemeket, de azért ezt kerüljük, csak gondot okozunk magunknak. A normál és az asszociatív típusú tömbök a PHP programozás során rendkívül változatosan és hatékonyan használhatók, főleg akkor, ha tudjuk azt, hogy a PHP a tömbök elemeire, az elemszámokra és a tömbelemek típusaira vonatkozóan rendkívül szabad kezet ad nekünk:

  • Többdimenziós tömbön belül az egyik index lehet asszociatív, a másik normál
  • Többdimenziós tömb esetében a tömbelem tömböknek nem kell feltétlenül azonos elemszámúaknak lenni, vagyis $tomb[1] lehet öt elemű, míg $tomb[2] lehet akár 8 elemű is.
  • A tömbökben a különböző típusú adatok keverhetők.

Vagyis elég nagy szabadsággal használhatjuk a tömbváltozókat, mégis érdemes szem előtt tartani, hogy ha lehet, járjunk el következetesen a változók értékadásával és azok használatával.