Forum und email

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:

  • SORT_ASC - növekvő sorrendbe rendez
  • SORT_DESC - csökkenő sorrendbe rendez

Rendezési jelzők:

  • SORT_REGULAR - megszokott módon hasonlítja össze az elemeket
  • SORT_NUMERIC - számként hasonlítja össze az elemeket
  • SORT_STRING - szövegként hasonlítja össze az elemeket

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.

Example#1 Több tömb alapján történő rendezés

<?php
$ar1 
= array("10"100100"a");
$ar2 = array(13"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)
}

Example#2 Többdimenziós tömbök rendezése

<?php
$ar 
= array(
       array(
"10"11100100"a"), 
       array(   
1,  2"2",   3,   1)
      );
array_multisort($ar[0], SORT_ASCSORT_STRING,
                
$ar[1], SORT_NUMERICSORT_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)
  }
}

Example#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($volumeSORT_DESC$editionSORT_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

Example#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_lowercaseSORT_ASCSORT_STRING$array);

print_r($array);
?>

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

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