Seite 1 von 2
PHP assoziatives Array sortieren (nach Index)
Verfasst: Do Nov 24, 2011 6:23 am
von HerrKlinke
Hi,
also ich habe ein mehrdimensionales, assoziatives Array mit 2 bis 4 Dimensionen.
Typisch sind aber 3.
Jetzt möchte ich die 1. Ebene nach den Index-Strings sortieren lassen. Und dann für jedes Unterarray auch diese Sortierung vornehmen.
Wie erreiche ich das?
Ich dachte an eine Lösung wie etwa:
Code: Alles auswählen
sortiere($array) // 1. Dimension sortieren
foreach($array as &$element) {
sortiere $element // 2. Dimension sortieren
}
Nur ich glaube, dass die nativen PHP Sortierfunktionen nicht wirklich nach dem Index gehen, sondern nach den Werten.
Bei meinem Array ist aber schon der Index eine Art Wert.
Es ist ein Kategorie, Unterkategorie Stammbaum in denen dann schließlich Daten sind.
Die Kategorienamen tauchen leider ausschließlich im Index auf, und nach denen möchte ich sortieren.
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Do Nov 24, 2011 8:16 am
von C@mper
Hilft Dir das?
Code: Alles auswählen
//---------------------------------------------------------------------------
//- Name : SortAssocArrayByMultipleKeys -
//- Descript : Assoziatives Array Sortieren. -
//- Es kann nach mehreren Keys gleichzeitig und -
//- case sensitiv sortiert werden. -
//- -
//- ------------------------------------------------------- -
//- -
//- Example : $aMuster[0]['Name'] = 'Anton'; -
//- $aMuster[0]['Alter'] = '51'; -
//- $aMuster[1]['Name'] = 'Nonym'; -
//- $aMuster[1]['Alter'] = '54'; -
//- $aMuster[2]['Name'] = 'Dow'; -
//- $aMuster[2]['Alter'] = '55'; -
//- -
//- $aSortOptions[0]['name'] = 'Name'; -
//- $aSortOptions[0]['sort'] = "ASC"; -
//- $aSortOptions[0]['case'] = "TRUE"; -
//- -
//- $aSortOptions[1]['name'] = 'Alter'; -
//- $aSortOptions[1]['sort'] = "DESC"; -
//- $aSortOptions[1]['case'] = "FALSE"; -
//- -
//- SortAssocArrayByMultipleKeys($aMuster, $aSortOptions); -
//- -
//- ------------------------------------------------------- -
//- -
//- Args : (array) $aArray - (Adresse) zu sortierendes Array -
//- (array) $aSortOptions - Sortier Optionen -
//- Ret-Values : keine (void) -
//- created : 14.07.2009 - BF -
//- changes : -
//---------------------------------------------------------------------------
function SortAssocArrayByMultipleKeys(&$aArray, $aSortOptions = array())
{
$sFunction = ''; // String nimmt den kompl. Funktionsinhalt auf
while (list($key) = each($aSortOptions))
{
if (isset($aSortOptions[$key]['case']) && ($aSortOptions[$key]['case'] == TRUE))
$sFunction .= 'if (strtolower($a["' . $aSortOptions[$key]['name'] . '"])<>strtolower($b["' . $aSortOptions[$key]['name'] . '"])) { return (strtolower($a["' . $aSortOptions[$key]['name'] . '"]) ';
else
$sFunction .= 'if ($a["' . $aSortOptions[$key]['name'] . '"]<>$b["' . $aSortOptions[$key]['name'] . '"]) { return ($a["' . $aSortOptions[$key]['name'] . '"] ';
if (isset($aSortOptions[$key]['sort']) && ($aSortOptions[$key]['sort'] == "DESC"))
$sFunction .= '<';
else
$sFunction .= '>';
if (isset($aSortOptions[$key]['case']) && ($aSortOptions[$key]['case'] == TRUE))
$sFunction .= ' strtolower($b["' . $aSortOptions[$key]['name'] . '"])) ? 1 : -1; } else';
else
$sFunction .= ' $b["' . $aSortOptions[$key]['name'] . '"]) ? 1 : -1; } else';
}
$sFunction .= ' { return 0; }';
usort($aArray, create_function('$a, $b', $sFunction));
} // SortAssocArrayByMultipleKeys()
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Do Nov 24, 2011 8:37 am
von HerrKlinke
Hmm, also das Problem ist ja, das ich die Schlüsselfelder nicht kenne.
In dem Beispiel haben ja alle Arrays einen Index "Name" und einen "Alter".
Code: Alles auswählen
$aSortOptions[1]['name'] = 'Alter';
$aSortOptions[1]['sort'] = "DESC";
$aSortOptions[1]['case'] = "FALSE";
Also kann ich sagen, er soll nach Spalte 'Alter' sortieren.
Bei meinem Array kenne ich aber diese Schlüssel gar nicht.
Ich will im Prinzip sagen: sortiere nach den Schlüsselnamen der 1. Ebene. Die Werte darin interessieren gar nicht.
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Do Nov 24, 2011 9:02 am
von HerrKlinke
Ok, ich habs mal selber versucht, weil ich nicht denke, dass es dafür keine Standardfunktion gibt.
Funktioniert perfekt.
Code: Alles auswählen
<?php
$arr = array();
$arr["Hallo"]["Alles"]["Klar"] = "123455";
$arr["Hallo"]["Was"]["Geht"] = "XYZ";
$arr["Hallo"]["Ist"]["Da Wer"] = "qwertz";
$arr["Tschüß"]["Xylophon"]["Ahoi"] = "1efe55";
$arr["Tschüß"]["Täter"]["Was denn"] = "efaef";
$arr["Tschüß"]["Moin"]["Tach"] = "were";
$arr["Aloa"]["Xylophon"]["Ahoi"] = "1efe55";
$arr["Aloa"]["Täter"]["Was denn"] = "efaef";
$arr["Aloa"]["Moin"]["Tach"] = "were";
function sortArrayByFirstIndexNames($arr,$options) {
$indexNames = array();
$sortiert = array();
foreach($arr as $index => $element) {
$indexNames[] = $index;
}
asort($indexNames,$options);
foreach($indexNames as $element) {
$sortiert[$element] = $arr[$element];
}
return $sortiert;
}
$arr = sortArrayByFirstIndexNames($arr,SORT_ASC); // 1. Ebene sortieren
foreach($arr as &$element) { // 2. Ebene sortieren
$element = sortArrayByFirstIndexNames($element,SORT_ASC);
}
echo("<pre>");
print_r($arr);
echo("/<pre>");
?>
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Do Nov 24, 2011 9:07 am
von Xin
Klingt für mich nach einer Baumstruktur.
Die erste Ebene listest Du auf und sortierst danach. Jeder Punkt der Liste zweigt auf eine weitere Liste: die zweite Dimension/bzw. die Daten (bei nur einer Dimension). Die zweite Dimension kannst Du nun ebenso sortieren. Die Listen sollten entsprechend kurz sein, weil die Listen der zweiten Dimension ja schon von der ersten abhängig sind.
Auch hier wird auf eine Liste verwiesen, die die Dritte Dimension sortiert, bzw. es kommen die Daten.
Nachdem Du alles einsortiert hast, lässt Du alle Listen sortieren und kannst sie dann per L-R rekursiv auslesen und in eine sortierte Liste überführen.
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Do Nov 24, 2011 9:20 am
von HerrKlinke
Xin hat geschrieben:Klingt für mich nach einer Baumstruktur.
Genau.
Xin hat geschrieben:
Die erste Ebene listest Du auf und sortierst danach. Jeder Punkt der Liste zweigt auf eine weitere Liste: die zweite Dimension/bzw. die Daten (bei nur einer Dimension). Die zweite Dimension kannst Du nun ebenso sortieren. Die Listen sollten entsprechend kurz sein, weil die Listen der zweiten Dimension ja schon von der ersten abhängig sind.
Auch hier wird auf eine Liste verwiesen, die die Dritte Dimension sortiert, bzw. es kommen die Daten.
Nachdem Du alles einsortiert hast, lässt Du alle Listen sortieren und kannst sie dann per L-R rekursiv auslesen und in eine sortierte Liste überführen.
Hmm so ähnlich habe ich mir das auch überlegt.
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Fr Nov 25, 2011 10:16 pm
von Dominik
Dann mach dir ne Funktion die so sortiert wie du möchtest und wende auf dein array zb "array_walk_recursive" an
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Fr Nov 25, 2011 10:29 pm
von cloidnerux
Schau dir im Wiki die Sortierfunktionen an und implementiere dir deine Funktionalität selbst
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Fr Nov 25, 2011 10:43 pm
von Dominik
Aber was du suchst nennt sich "ksort"
http://www.php.net/manual/de/function.ksort.php
Rekursiver ansatz steht auch drunter
Re: PHP assoziatives Array sortieren (nach Index)
Verfasst: Fr Nov 25, 2011 11:03 pm
von flip90
echo $begruessung;
jetzt war ich leider zu langsam
ja, ksort() ist was du suchst.
echo $verabschiedung;