Moin!
Dann brauchst du eine andere Sortierfunktion. Der Name cmp ist ja nicht fest vorgegeben, sondern von dir frei gewählt.
Eben! Und _das_ verstehe ich nicht.
Zuerst die Namensgebung. Statt "function cmp... usort($trans, 'cmp')..." kannst du problemlos auch "function abc ... usort($trans, 'abc')..." machen.
Du kannst also problemlos erstens deine Vergleichsfunktion beliebig nennen, als auch zwei verschiedene Vergleichsfunktionen "cmp1" und "cmp2" benutzen, und je nach Anforderung an das Sortieren usort($trans, "cmp1") oder usort($trans,"cmp2") aufrufen, wenn du je nach Code mal nach der einen oder der anderen Art sortieren willst.
Ist die Namensgebung der Vergleichsfunktionen damit klar?
Schon gestern habe ich so begonnen die Funktion umzubenennen, um ein Argument zu erweitern und - um ganz sicher zu gehen - inhaltlich leeren.
Das sind ja gleich drei Dinge auf einmal - das geht nun wirklich nicht.
Der wichtigste Punkt ist: Die Funktion kann nur zwei Parameter entgegennehmen. Punkt, Ende, Aus. Mehr sind nicht erlaubt. Wenn du also in die _eine_ Funktion noch die Information "mal so, mal anders sortieren" reinkriegen wolltest, blieben dir nurmehr globale Variablen oder das Verstecken dieser Information in einer der superglobalen Variablen. Beides ist eklig! Nicht machen! :)
OK, ich sehe nirgendwo ein Befüllen von a, b und c, aber im Früchte-Beispiel des Manuals auch nicht. Und daran komme ich nicht vorbei, hab ein Brett vorm Kopf, mir erscheint das mittlerweile wie die Suche einer Ecke am Hühnerei. Zeigt Du es mir?
Die Sache ist relativ einfach, wenn man weiß, wie in allen Programmiersprachen die Sortieralgorithmen realisiert werden. Deshalb als Grundlagenwissen für dich: Sortieren ist immer: Vergleichen zweier Elemente der zu sortierenden Menge, und ggf. ihr Vertauschen. Die Optimierungsmöglichkeiten eines Sortierungsalgorithmus liegen in der Wahl der zwei Elemente, aber das Vergleichen und Vertauschen muß jeder Algorithmus immer auf die gleiche Weise veranstalten.
Und das Vergleichen zweier Elemente steuert dabei, wie die Menge sortiert wird: Alphabetisch, numerisch, nach Stringlänge, mit "natürlicher Sortierung", ...
Die Funktion usort() nimmt nach einem optimierten Algorithmus also jeweils zwei Elemente aus deinem Array, und ruft mit diesen zwei Elementen als Parametern die Vergleichsfunktion auf. Andere sort-Funktionen rufen direkt intern existierende PHP-Funktionen auf, bei usort() hast du eben die totale Freiheit, das selbst zu bestimmen. Deswegen gibts z.B. auch kein usorti() für case-insensitives Sortieren - das mußt du im Bedarfsfall selbermachen.
Die Vergleichsfunktion muß als Rückgabewert -1, 0 oder 1 zurückgeben, je nachdem, ob der erste übergebene Wert kleiner, gleich oder größer als der zweite übergebene Wert ist. Wenn der Wert 1 kleiner ist, bedeutet das für die Sortierung, dass er weiter nach vorne als Wert 2 gehört, ist er größer, dann gehört er weiter nach hinten, und bei Gleichheit sind sie eben gleich.
Das bedeutet für dich als Programmierer der Vergleichsfunktion: Du kriegst die zwei Werte, die traditionell $a und $b genannt werden, und mußt nun entscheiden, welcher dieser Werte nach deinen Sortierkriterien weiter vorn in der sortierten Liste stehen soll.
Wenn du numerisch aufsteigend sortieren willst, müssen die kleinen Zahlen vor den großen Zahlen kommen. Also gehört $a dann vor $b, wenn es kleiner ist - der Rückgabewert dafür ist -1.
Als ganz banales Beispiel wäre das:
function cmp ($a, $b)
{
if ($a < $b) return -1;
if ($a > $b) return 1;
return 0;
}
usort($array, "cmp");
Den gleichen Effekt (numerisches Sortieren) würdest du natürlich auch mit "sort($array, SORT_NUMERIC)" erreichen können (siehe http://de2.php.net/manual/de/function.sort.php).
Aber sobald du ein verschachteltes Array hast, mußt du eben zu deiner eigenen Sortierfunktion greifen:
function cmp ($a, $b)
{
if ($a['intwert'] < $b['intwert']) return -1;
if ($a['intwert'] > $b['intwert']) return 1;
return 0;
}
Und wenn die Sortierfunktion was anderes tun soll, als nach Zahlenwerten zu sortieren, oder bei Gleichheit der Zahlenwerte noch andere Felder vergleichen, mußt du das eben nach deinen Wünschen programmieren. :)
- Sven Rautenberg