array_multisort

(PHP 4, PHP 5)

array_multisort --  Egyszerre több tömböt vagy egy többdimenziós tömböt rendez

Leírás

bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )

Siker esetén TRUE értékkel tér vissza, ellenkező esetben FALSE értéket ad.

Az array_multisort() arra használható, hogy egyszerre több tömböt vagy egy többdimenzós tömböt rendezzen sorba egy vagy dimenziója szerint.

Az asszociatív (string) kulcsokat megőrzi a rendezés során, a numerikus indexeket újraindexeli.

A megadott tömböket egy képzeletbeli, sorok alapján rendezendő táblázat oszlopainak tekinthetők. Ez hasonlít az SQL ORDER BY cikkelyének feladatára. Ez első tömb, ami alapján először rendez. Az ebben a tömbben levő ugyanolyan sorok (elemek) a soron következő tömb szerint lesznek tovább rendezve, és így tovább végig a tömbökön.

Ennek a függvénynek a argumentumlistája kicsit szokatlan, de nagyon rugalmas. A legelső paraméternek mindig tömbnek kell lennie, ezután minden paraméter lehet egy tömb vagy egy a következő rendezést szabályzó jelzőértékek közül.

Sorrendi jelzők:

Rendezési jelzők:

Nem lehet két ugyanolyan típusú jelzőt egymás után megadni. Ezek a jelzők csak a közvetlenül előttük álló tömb szerinti rendezést befolyásolják, minden tömb paraméternél az alapértelmezés lép életbe: SORT_ASC és SORT_REGULAR.

Példa 1. Több tömb alapján történő rendezés

<?php
$ar1
= array("10", 100, 100, "a");
$ar2 = array(1, 3, "2", 1);
array_multisort($ar1, $ar2);

var_dump($ar1);
var_dump($ar2);
?>

A rendezés után az első tömb tartalma "10", "a", 100, 100, a másodiké 1, 1, "2", 3. A második tömb elemei az első tömb megegyező elemeinek megfelelően (100, 100) szintén rendezettek.

array(4) {
  [0]=> string(2) "10"
  [1]=> string(1) "a"
  [2]=> int(100)
  [3]=> int(100)
}
array(4) {
  [0]=> int(1)
  [1]=> int(1)
  [2]=> string(1) "2"
  [3]=> int(3)
}

Példa 2. Többdimenziós tömbök rendezése

<?php
$ar
= array(
       array(
"10", 11, 100, 100, "a"),
       array(   
1,  2, "2",   3,   1)
      );
array_multisort($ar[0], SORT_ASC, SORT_STRING,
                
$ar[1], SORT_NUMERIC, SORT_DESC);
var_dump($ar);
?>

Ebben a példában a rendezés után az első tömb "10", 100, 100, 11, "a" (stringekként lett növekvő sorrendbe rendezve). A második tartalma 1, 3, "2", 2, 1 (számokként rendezve csökkenő sorrendbe).

array(2) {
  [0]=> array(5) {
    [0]=> string(2) "10"
    [1]=> int(100)
    [2]=> int(100)
    [3]=> int(11)
    [4]=> string(1) "a"
  }
  [1]=> array(5) {
    [0]=> int(1)
    [1]=> int(3)
    [2]=> string(1) "2"
    [3]=> int(2)
    [4]=> int(1)
  }
}

Példa 3. Adatbázis eredményhalmazok rendezése

Ebben a példában minden data tömbbeli elem egy táblabeli sornak felel meg.

Példa adat:

volume | edition
-------+--------
    67 |       2
    86 |       1
    85 |       6
    98 |       2
    86 |       6
    67 |       7

Az adat egy tömb, melynek neve data. Ez például a mysql_fetch_assoc() függvény ciklusban való hívásával kapható meg.

<?php
$data
[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
?>

Ebben a példában volume szerint csökkenőleg, edition szerint növekvőleg rendezünk.

Van egy tömbünk a sorokról, de a array_multisort() oszlopokból álló tömböt vár, ezért a következő kódot használjuk, hogy megkapjuk az oszlopokat, majd elvégezzük a rendezést.

<?php
// Oszlopok előállítása
foreach ($data as $key => $row) {
    
$volume[$key]  = $row['volume'];
    
$edition[$key] = $row['edition'];
}

// Rendezzük volume szerint csökkenőleg, majd edition szerint növekvőleg.
// A $data tömb az utolsó paraméter, hogy a közös kulcs alapján rendezzen.
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>

Az adathalmaz a rendezés után így néz ki:

volume | edition
-------+--------
    98 |       2
    86 |       1
    86 |       6
    85 |       6
    67 |       2
    67 |       7

Példa 4. Kis- és nagybetűk egyenlőek

Mind a SORT_STRING mind a SORT_REGULAR esetén különbséget tesz a kis- és nagybetűk között, a nagybetűvel kezdődő stringek kisebbek mint a kisbetűvel kezdődőek.

Ha azt akarod, hogy a rendezés ne tegyen különbséget a kis- és nagybetűk között, a rendezést a kisbetűssé alakított tömb szerint végezd.

<?php
$array
= array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array);

array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);

print_r($array);
?>

A fenti példa a következő kimenetet adja:

Array
(
    [0] => Alpha
    [1] => atomic
    [2] => bank
    [3] => Beta
)