Array sortieren
pl
- php
Ich hab da ein Array in dem sind die Elemente assoziative Arrays:
[
[url => '', title => '', descr => '', class => ''],
[url => '', title => '', descr => '', class => ''],
[url => '', title => '', descr => '', class => '']
]
Der besseren Lesbarkeit wegen hab ich das Quoten der Schlüssel mal weggelassen. Wie sieht denn eine Sortierfunktion aus die nach title sortiert?
NFG
Hallo Rolf,
in der Vergleichsfunktion, die <array>.sort mitgegeben wird, vergleichst du nicht a und b, sondern a.title und b.title.
Edit: Sorry, habe das Schlagwort PHP übersehen.
Gruß
Jürgen
Danke!
in der Vergleichsfunktion, die <array>.sort mitgegeben wird, vergleichst du nicht a und b, sondern a.title und b.title.
Edit: Sorry, habe das Schlagwort PHP übersehen.
Das Schlagwort lautet Vergleichsfunktion
. Aufgabe gelöst 😉
PS: Das Lustige an php.net ist, daß man immer erstmal goooooogel bemühen muss um da was zu finden.
Hallo pl,
kann helfen, muss aber nicht immer sein. Du darfst auch Bing oder DuckDuckGo bemühen, oder:
Rolf
Ok, die Pflicht haben wir, jetzt die Kür: Alle URLs in denen die Eigenschaft $a['isa'] == 'folder'
gesetzt ist, sollen ganz unten/hinten stehen.
Die Sortierung nach title soll beibehalten werden. Idee?
MFG
Hallo pl,
Ja. Verwende einen Sortier-Callback.
function sortByFolderAndTitle($a, $b)
{
$cmpFolder = ($a['isa'] == 'folder') <=> ($b['isa'] == 'folder')
if ($cmpFolder == 0)
$cmpFolder = $a['title'] <=> $b['title'];
return $cmpFolder;
}
// Oder, nach Anwendung einer Uglifizierung:
function sortByFolderAndTitle($a, $b)
{
return ($f=($a['isa']=='folder')<=>($b['isa']=='folder'))!=0?$f:$a['title']<=>$b['title'];
}
Ach ja. Du verwendest ja ein nicht mehr unterstütztes PHP (alles vor 7.2). Dann musst du den <=>
Operator entsprechend ersetzen, z.B. durch eine spaceShip Funktion.
function spaceShip($a, $b) {
if (PHP_MAJOR_VERSION > 6) die("Replace me with <=> !");
return $a<=$b?$a==$b?0:-1:1;
}
Rolf
Ok, fertig. Meinen PHP Seiten siehst sieht man nicht an welche Version darunterliegt. Und auch nicht ob die Seite mit Perl oder mit PHP erstellt wurde. Außer dem Hinweis im ersten <p>-Abschnitt.
MFG
Tach!
Wie sieht denn eine Sortierfunktion aus die nach title sortiert?
Das PHP-Handbuch listet alle verfügbaren Sortierfunktionen. Die einfachste und gängigste Lösung ist, eine der u*sort-Funktionen mit benutzerdefinierter Vergleichsfunktion zu nehmen. Innerhalb der Funktion vergleichst du den gewünschten Wert der beiden übergebenen Datensätze.
Für array_multisort() ist die Datenstruktur nicht geeignet, das möchte ein nach Spalten organisiertes Array statt nach Datensatz pro Zeile. Die Daten in der Spaltenform zu organisieren hat meist anderenorts mehr Nachteile als Vorteile hier bei der Sortierung.
dedlfix.
Tach!
Wie sieht denn eine Sortierfunktion aus die nach title sortiert?
Das PHP-Handbuch listet alle verfügbaren Sortierfunktionen.
Hab ich auch gefunden. Da muss man aber auch erstmal selber draufkommn, daß man eine Sortierfunktion mit callback dazu braucht.
MFG
Tach!
Da muss man aber auch erstmal selber draufkommn, daß man eine Sortierfunktion mit callback dazu braucht.
Das gibts schon ewig in PHP und ist auch nicht unüblich anderenorts, wo komplexere Strukturen als einfache Arrays mit skalaren Werten verarbeitet werden.
dedlfix.
Hallo pl,
beginne deine Handbuchlektüre mit usort, wenn Dir die Keys im Array egal sind. Ansonsten mit uasort.
Für die Callback-Funktion liest Du weiter bei „Callable“. Das kann verschiedenes sein.
Callables haben noch ein paar Spezialvariationen, die kannst Du bei Bedarf nachlesen.
Der Callback bekommt zwei Parameter $a und $b übergeben, nämlich die zu vergleichenden Array-Elemente.
Er muss einen negativen Integer, 0 oder einen positiven Integer zurückgeben, je nach dem, ob $a<$b, $a==$b oder $a>$b gilt. Bei Strings kannst Du dafür ab PHP 7 den Spaceship Operator <=>
nutzen. Der Betrag des Integers spielt keine Rolle.
Rolf