# Multidimensionales Array nach bestimmten Wert sortieren



## guenter024 (26. Juli 2013)

Hallo PHP-Freunde,


Stehe vor einem Sortierungsproblem:
Folgendes Mehrdimensionales Array als Beispiel, welches meine vorhandene Struktur widerspiegelt:


```
Array
(
    [1952] => Array
        (
            [0] => 1
            [1] => Apfel
            [2] => rot
        )

    [3762] => Array
        (
            [0] => 2
            [1] => Birne
            [2] => grün
        )

    [4378] => Array
        (
            [0] => 3
            [1] => Banane
            [2] => gelb
        )

)
```

Die vorderen Schlüssel sind Artikelnummern, daher auch unique, jedoch nicht für die Sortierung gewünscht.
Sortiert werden soll nach dem ersten key [0] in den subarrays (also hier 1, 2, 3).
Habe nun versucht, einfach den Wert im Schlüssel [0] zu ändern und dann mit usort aus den Beispielen von php.net neu zu sortieren.


```
// Werte ändern
$_SESSION['array']['1952'][0] = 2;
$_SESSION['array']['3762'][0] = 1;

// Sortieren
function build_sorter($key) {
    return function ($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
}

usort($_SESSION['array'], build_sorter(0));
```

Allerdings wird hier nun auch der vordere Schlüssel (also die Artikelnummer) neu indexiert.
Wie kann ich dies verhindern?


Ich hoffe wieder mal die Hilfe von den Profis


----------



## saftmeister (27. Juli 2013)

Wenn du Hilfe von Profis willst, schau bei yaslaw ins Wiki: http://wiki.yaslaw.info/wikka/PhpArraySortBySubarrayItem


----------



## guenter024 (2. August 2013)

Hi, 
Sorry, das ich so lange nicht antworten konnte, ich musste zwischendurch anderes erledigen.
Aber jetzt hoffe ich, hier dranbleiben zu können.

Danke erstmal auch für die Antwort. Ist Yaslaw nicht mehr aktiv hier im Forum?
Er hat mir hier schon ein paar Mal weitergeholfen.  
Kenne natürlich die Seite von Yaslaw und somit auch diese Funktion, im Grunde produziert sie aber das identische Ergebnis, welches auch das Skript von php.net erreicht hat, nämlich das die vorderen keys, in welchen bspw. die Artikelnummern stehen, neu indexiert werden und verloren gehen.

Wenn ich also in Yaslaws Funktion das Beispielarray so verändere

```
$array[1235] = array('Name' => 'Eintrag 1', 'sort' => 15);
$array[1208] = array('Name' => 'Eintrag 2', 'sort' => 2);
$array[7659] = array('Name' => 'Eintrag 3', 'sort' => 5);
$array[3205] = array('Name' => 'Eintrag 4', 'sort' => 4);
```

Kommt nach Aufruf der Funktion das raus:

```
$array[0] = array('Name' => 'Eintrag 2', 'sort' => 2);
$array[1] = array('Name' => 'Eintrag 4', 'sort' => 4);
$array[2] = array('Name' => 'Eintrag 3', 'sort' => 5);
$array[3] = array('Name' => 'Eintrag 1', 'sort' => 15);
```

Die Funktion müsste also noch irgendwie um den vordersten Schlüssel erweitert werden.
Hat hier jemand eine Idee?
Ich stehe jedenfalls voll auf dem Schlauch...

Gruß
Günni


----------



## ComFreek (2. August 2013)

Hi,

hast du dir schonmal [phpf]uasort[/phpf] angeschaut?


> Sort an array with a user-defined comparison function and maintain index association


Genau das, was du suchst.

Hier ein Beispielcode:

```
<?php
$testArr = array(
	'4378' => array(
		3, 'Banane', 'gelb'
	),
	'1952' => array(
		1, 'Apfel', 'rot'
	),
	'3762' => array(
		2, 'Birne', 'grün'
	)
);

function cmpFunc($a, $b) {
	return $a[0] > $b[0];
}

uasort($testArr, 'cmpFunc');
var_dump($testArr);
```
Gibt genau deine gewünsche Arraystruktur aus.


PS: Doch, yaslaw müsste noch hier sein


----------



## guenter024 (5. August 2013)

Genau was ich suchte. 
Vielen Dank.

Mich würde jetzt noch der Funktionsablauf interessieren, um sie auch wirklich zu verstehen.
Bitte korrigiert mich:

Die php-Funktion uasort erhält als Parameter 1 das Array und als Parameter 2 die Vergleichsfunktion cmpFunc(). uasort geht nacheinander das Array durch und cmpFunc() prüft nun, ob ein Unterschlüssel größer als der nachfolgende ist.
Nun sortiert das Array nach dem Ergebnis aus der Vergleichsfunktion.

Ist das so richtig?


----------



## ComFreek (5. August 2013)

guenter024 hat gesagt.:


> Ist das so richtig?


Ja, 100% richtig.

"Interessant" für dich wäre vielleicht noch, dass uasort() den ersten Parameter als Referenz nimmt, sodass uasort() das originale Array verändert!


----------

