Wie Array mit uasort sortieren?
Klaus
- php
Hallo miteinander,
ich habe ein Problem mit der uasort Funktion. Übergeben wird ein Array $ar unbekannter Länge, dessen Einträge entweder aus simplen Strings bestehen, oder selbst wieder arrays sind. Das könnte also so aussehen
Beispiel array $ar:
otto
Karl
Sportverein -> Müller, Kubatschke, Held
Heidi
Auszubildende -> Helbig, Schmid, Atkins
usw.
Jetzt möchte ich $ar mit
uasort($ar, "_compare");
sortieren, und zwar so, daß oben die Arrays sortiert stehen, dann die Namen. Schön wäre es, wenn innerhalb der Arrays ebenfalls wieder sortiert würde.
Der sortierte Array $ar sollte also so aussehen:
Auszubildende -> Atkins, Helbig, Schmid
Sportverein -> Held, Kubatschke, Müller
Heidi
Karl
Otto
Habe das mit diese Funktion versucht
function _compare($a, $b) {
if(is_array($a)) {
return -1;
}
else {
return 1;
}
}
Ich weiß, das ist nicht richtig. Ich blicke aber auch nicht genau durch, was $a und $b machen. Wird da alles mit allem verglichen, taucht jeder Wert also einmal als $a, und später nochmal als $b auf?
Es wäre schön, wenn Ihr einen Tipp habt, wie man diese Sortierung durchführen könnte.
Vielen Dank für Eure Hilfe
Klaus
Hallo Du Einer,
entscheide Dich, ob Du konforme Datensätze verwalten willst, oder ob es sich tatsächlich um Baumstrukturen handeln muss.
$_datensatz[1]['name'] = 'Müller';
$_datensatz[1]['herkunft'] = 'Sportverein';
$_datensatz[1]['vormame'] = 'Alexandra';
das wäre die meistens verwendete Struktur. Hier könnte der Satz [2] ganz andere Elemente und auch verschieden viele enthalten, als der Satz [1]. Dann wäre es aber keine tabellarische Struktur, abgebildet auf das "array", sondern eine echte Baumstruktur.
$_datensatz['name'][1] = 'Müller';
$_datensatz['herkunft'][1] = 'Sportverein';
$_datensatz['vormame'][1] = 'Alexandra';
$_datensatz['name'][2] = 'Meier';
$_datensatz['herkunft'][2] = 'Firma';
$_datensatz['vormame'][2] = 'Paul';
Das wäre nun eine tabellarische Struktur, abgebildet auf das "array".
Die kann man Spalte für Spalte sortieren, ohne dass die Zusammenhänge zwischen den Feldern der Datensätze verloren gehen, da die Keys beim Sortieren beibehalten werden.
ein natsort($_datensatz['name']);
http://de2.php.net/manual/de/function.natsort.php
würde die Spalte name also sortieren. Man kann dann die Datensätze in der Sortierung von name ausgeben lassen:
foreach($_datensatz['name'] as $key => $val)
{
echo "<p>Nr: $key<p>\n";
foreach($_datensatz as $colno => $fieldname)
{
echo "<p>$fieldname: $_datensatz[$fieldname][$key]<p>\n";
}
echo "<hr>\n";
}
Wenn man statt name eienn anderen 'Spaltennamen' nimmt, geht es auch.
*Hoffe ich jedenfalls* habs nicht extra nochmal ausprobiert.
LG
Chris
echo $begrüßung;
Ich blicke aber auch nicht genau durch, was $a und $b machen. Wird da alles mit allem verglichen, taucht jeder Wert also einmal als $a, und später nochmal als $b auf?
Das hängt von dem von PHP verwendeten Suchalgorithmus ab und ist für deine Vergleichsfunktion nicht weiter relevant. Die hat nur die Aufgabe, durch eine entsprechende Rückgabe dem Aufrufer mitzuteilen ob a kleiner/größer/gleich b ist.
Du müsstest also zurückgeben:
$a = Array, $b = string: Wert für $a < $b
(zu lesen: Wenn $a ein Array und $b ein String ist, dann gib den Wert laut Doku zurück, der für $a kleiner als $b zurückgegeben werden soll.)
$b = Array, $a = string: Wert für $a > $b
$a = Array, $b = Array: Wenn $a vor $b stehen soll: Wert für $a < $b sonst Wert für $a > b
$a = string, $b = string: Vergleich beider Variablen. strcmp() bietet sich hier an.
Wenn die Werte innerhalb von Arrays auch noch sortiert werden sollen wäre eine weitere Runde, beispielsweise mit foreach, angebracht, die bei einem Array dieses zum Sortieren schickt.
echo "$verabschiedung $name";
Danke Euch beiden.