Multidimensionales Array nach bestimmten Wert sortieren

guenter024

Erfahrenes Mitglied
Hallo PHP-Freunde,


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

Code:
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.

PHP:
// 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 :)
 
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
PHP:
$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:
PHP:
$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
 
Zuletzt bearbeitet:
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:
<?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 ;)
 
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?
 
Zuletzt bearbeitet:
Zurück