Über Array iterien und Unterarrays sortieren
Gunther
- php
Hallo Selfgemeinde,
ich habe ein Problem beim Sortieren eines Arrays.
Folgendes (konkretes) Beispiel:
Array
(
[id] => tutorials
[level] => 0
[filetype] => d
[name] => tutorials
[title] => Array
(
[0] => Tutorials
[1] =>
[2] =>
)
[sort] => Tutorials
[descendants] => Array
(
[0] => Array
(
[id] => tutorials:index
[level] => 1
[filetype] => f
[name] => index
[title] => Array
(
[0] => Index
[1] =>
[2] =>
)
[sort] => Index
)
[1] => Array
(
[id] => tutorials:lua
[level] => 1
[filetype] => d
[name] => lua
[title] => Array
(
[0] => Lua
[1] => LUA Tutorials
[2] =>
)
[sort] => LUA Tutorials
[descendants] => Array
(
[0] => Array
(
[id] => tutorials:lua:index
[level] => 2
[filetype] => f
[name] => index
[title] => Array
(
[0] => Index
[1] => LUA Tutorials
[2] =>
)
[sort] => LUA Tutorials
)
[1] => Array
(
[id] => tutorials:lua:unterordner_lua
[level] => 2
[filetype] => d
[name] => unterordner lua
[title] => Array
(
[0] => Unterordner Lua
[1] =>
[2] =>
)
[sort] => Unterordner Lua
[descendants] => Array
(
[0] => Array
(
[id] => tutorials:lua:unterordner_lua:index
[level] => 3
[filetype] => f
[name] => index
[title] => Array
(
[0] => Index
[1] =>
[2] =>
)
[sort] => Index
)
)
)
)
)
[2] => Array
(
[id] => tutorials:s5_-_dedk_tutorials
[level] => 1
[filetype] => d
[name] => s5_-_dedk_tutorials
[title] => Array
(
[0] => S5 - Dedk Tutorials
[1] => S5 - DEdK Tutorials
[2] =>
)
[sort] => S5 - DEdK Tutorials
[descendants] => Array
(
[0] => Array
(
[id] => tutorials:s5_-_dedk_tutorials:index
[level] => 2
[filetype] => f
[name] => index
[title] => Array
(
[0] => Index
[1] => S5 - DEdK Tutorials
[2] =>
)
[sort] => S5 - DEdK Tutorials
)
[1] => Array
(
[id] => tutorials:s5_-_dedk_tutorials:multiplayer
[level] => 2
[filetype] => d
[name] => multiplayer
[title] => Array
(
[0] => Multiplayer
[1] => Multiplayer
[2] =>
)
[sort] => Multiplayer
[descendants] => Array
(
[0] => Array
(
[id] => tutorials:s5_-_dedk_tutorials:multiplayer:index
[level] => 3
[filetype] => f
[name] => index
[title] => Array
(
[0] => Index
[1] => Multiplayer
[2] =>
)
[sort] => Multiplayer
)
)
)
[2] => Array
(
[id] => tutorials:s5_-_dedk_tutorials:verzeichnis_2
[level] => 2
[filetype] => d
[name] => verzeichnis_2
[title] => Array
(
[0] => Verzeichnis 2
[1] => Level 1 Überschrift
[2] =>
)
[sort] => Level 1 Überschrift
[descendants] => Array
(
[0] => Array
(
[id] => tutorials:s5_-_dedk_tutorials:verzeichnis_2:index
[level] => 3
[filetype] => f
[name] => index
[title] => Array
(
[0] => Index
[1] => Level 1 Überschrift
[2] =>
)
[sort] => Level 1 Überschrift
)
)
)
)
)
)
)
Dieses Array, welches ja (theoretisch) eine beleibige Tiefe haben kann, möchte ich nun durchgehen und jeweils alle Arrays unter [descendants] mittels einer benutzerdefinierten Funktion sortieren lassen (also per usort).
Ich kriege es aber einfach nicht hin, weder mit irgendwelchen for, foreach, while, each, noch sonst irgendwelchen Konstrukten.
Frage: Wie baue ich eine entsprechende Schleife/ Rekursion, sodass ich jedes enthaltene descendants-Array mit meiner Sortierfunktion sortiert bekomme?
Und nein: Am Aufbau des Arrays kann ich nichts verändern.
Vielen Dank für eure Hilfe - ich bin echt am verzweifeln!
Gruß Gunther
hi,
Frage: Wie baue ich eine entsprechende Schleife/ Rekursion, sodass ich jedes enthaltene descendants-Array mit meiner Sortierfunktion sortiert bekomme?
1. Nimm ein Array, sortiere es.
2. Wenn es descendants hat - gehe zu Schritt 1.
(Problematisch könnte dabei die Übergabe per value sein - da solltest du also ggf. explizit auf Übergabe per reference setzen.)
ich bin echt am verzweifeln!
Toller Hinweis.
gruß,
wahsaga
hi,
Frage: Wie baue ich eine entsprechende Schleife/ Rekursion, sodass ich jedes enthaltene descendants-Array mit meiner Sortierfunktion sortiert bekomme?
- Nimm ein Array, sortiere es.
- Wenn es descendants hat - gehe zu Schritt 1.
Ja, wie das "verbal" funktioniert ist mir auch klar ;). Aber wie funktioniert es per PHP Script? Das ganze ist ja _nur_ein_Array (mit entsprechenden Unterarrays).
Woher weiß ich denn, wenn ich von 2. zurück zu 1. gehe, welches (Unter-)Array ich da gerade habe?
(Problematisch könnte dabei die Übergabe per value sein - da solltest du also ggf. explizit auf Übergabe per reference setzen.)
Ah ja - und das sieht dann praktisch wie aus?
Bitte bedenke, dass du es hier mit einem (mehr oder weniger) PHP-Anfänger zu tun hast - Danke!
ich bin echt am verzweifeln!
Toller Hinweis.
Ja - was soll ich sonst schreiben? Ich bin nicht eben vor 5 Minuten auf dieses Problem gestoßen und habe mal direkt hier nachgefragt, sondern versuche es schon seit mehreren Stunden (gestern und heute) selber zu lösen. Ich habe auch schon alle mir bekannten Quellen im Netz dazu abgeklappert, aber ich schaffe es eben nicht, das Problem alleine zu lösen.
gruß,
wahsaga
Gruß Gunther
hi,
ich bin echt am verzweifeln!
Toller Hinweis.
Ja - was soll ich sonst schreiben? Ich bin nicht eben vor 5 Minuten auf dieses Problem gestoßen und habe mal direkt hier nachgefragt, sondern versuche es schon seit mehreren Stunden (gestern und heute) selber zu lösen. Ich habe auch schon alle mir bekannten Quellen im Netz dazu abgeklappert, aber ich schaffe es eben nicht, das Problem alleine zu lösen.
Mag ja sein - trotzdem: Zitat #51
gruß,
wahsaga
Hi,
ich bin echt am verzweifeln!
Toller Hinweis.
Ja - was soll ich sonst schreiben? Ich bin nicht eben vor 5 Minuten auf dieses Problem gestoßen und habe mal direkt hier nachgefragt, sondern versuche es schon seit mehreren Stunden (gestern und heute) selber zu lösen. Ich habe auch schon alle mir bekannten Quellen im Netz dazu abgeklappert, aber ich schaffe es eben nicht, das Problem alleine zu lösen.
Mag ja sein - trotzdem: Zitat #51
OK - sehe ich ein. Also werde ich zukünftig jegliche Äußerungen zu meinem Gemütszustand unterlassen, da diese für das Problem und seine Lösung nicht relevant sind.
Und wie sieht es denn jetzt mit einer konkreten Antwort zu meinem Problem aus!? Felix war ja auch so nett, und hat schon versucht mir zu helfen - leider reichen die bisher gegebenen Antworten aber noch nicht aus, um mich auf die Lösung des Problems zu bringen.
Weitere Hilfe wäre also sehr nett - Danke!
Gruß Gunther
Lieber Gunther,
Frage: Wie baue ich eine entsprechende Schleife/ Rekursion, sodass ich jedes enthaltene descendants-Array mit meiner Sortierfunktion sortiert bekomme?
Also der "Prototyp" eines Arrays sieht doch anscheinend so aus:
array
(
[id] => {string}
[level] => {positive Integer-Zahl}
[filetype] => {Buchstabe}
[name] => {string}
[title] => Array
(
[0] => {string}
[1] => {string}
[2] => {string}
)
[sort] => {string}
[descendants] => array({weiteres array dieses typs}, {weiteres array dieses typs}, ...)
)
Was Du eigentlich sortieren möchtest, ist doch der Index "descendants", oder? Dann brauchst Du zwei Ansätze:
1.) sortiere das root-Array (hat den Aufbau wie der "Prototyp") mittels
usort():
- schnappe den index "descendants" und sortiere ihn als eigenes Array
mittels einer weiteren Callback-Funktion (2.)
- lasse alle anderen Indices unangetastet!
2.) sortiere ein [descendants]-Array mittels usort()
- sollte die Callback-Funktion im Unter-Array weitere descendants
finden, so sortiert sie diese mittels usort() und der Callbackfunktion
in 1.)
- die Callback-Funktion untersucht das jeweilige Unter-Array und liefert
den typischen Rückgabe-Wert.
3.) Dadurch hast Du nun Rekursion.
Noch Fragen?
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo lieber Felix,
Frage: Wie baue ich eine entsprechende Schleife/ Rekursion, sodass ich jedes enthaltene descendants-Array mit meiner Sortierfunktion sortiert bekomme?
Also der "Prototyp" eines Arrays sieht doch anscheinend so aus:
array
(
[id] => {string}
[level] => {positive Integer-Zahl}
[filetype] => {Buchstabe}
[name] => {string}
[title] => Array
(
[0] => {string}
[1] => {string}
[2] => {string}
)[sort] => {string}
[descendants] => array({weiteres array dieses typs}, {weiteres array dieses typs}, ...)
)
>
> Was Du eigentlich sortieren möchtest, ist doch der Index "descendants", oder? Dann brauchst Du zwei Ansätze:
> 1.) sortiere das root-Array (hat den Aufbau wie der "Prototyp") mittels
> usort():
> - schnappe den index "descendants" und sortiere ihn als eigenes Array
> mittels einer weiteren Callback-Funktion (2.)
> - lasse alle anderen Indices unangetastet!
> 2.) sortiere ein [descendants]-Array mittels usort()
> - sollte die Callback-Funktion im Unter-Array weitere descendants
> finden, so sortiert sie diese mittels usort() und der Callbackfunktion
> in 1.)
> - die Callback-Funktion untersucht das jeweilige Unter-Array und liefert
> den typischen Rückgabe-Wert.
>
> 3.) Dadurch hast Du nun Rekursion.
>
> Noch Fragen?
Ja ;). Ich habe folgendes probiert:
~~~php
$mein_ausgangs_array = sort_array($mein_ausgangs_array);
function sort_array($arraytosort) {
usort($arraytosort, "gp_sort_dirsandfiles");
foreach($arraytosort as $key => $val) {
if($key == 'descendants' && count($val) > 1) $val = sort_array($val);
}
return $arraytosort;
}
Das sortiert mir aber nur die oberste Ebene in meinem Array.
Ich kapier bei diesem (Array-)Konstrukt nicht, wie ich jeweils die Unterarrays (also die 'descendants') referenzieren muss, damit am Schluss mein komplettes Ausgangsarray sortiert ist.
Wenn du mir noch ein wenig weiterhelfen könntest, wäre ich dir sehr dankbar!
Gruß Gunther
Lieber Gunther,
$mein_ausgangs_array = sort_array($mein_ausgangs_array);
function sort_array($arraytosort) {
usort($arraytosort, "gp_sort_dirsandfiles");
foreach($arraytosort as $key => $val) {
if($key == 'descendants' && count($val) > 1) $val = sort_array($val);
}
return $arraytosort;
}
Dein Versuch ist schon ganz gut, jedoch hast Du nur eine Callback-Funktion, während in meinem Beispiel dieser zweie sind!
Ich könnte mir folgende Herangehensweise vorstellen:
~~~php
function sortiere_descendants($desc_array) {
}
function sortiere_master_array($master_array) {
}
$mein_ausgangs_array = [... DB-Abfrage...oder...sonstwas];
usort($mein_ausgangs_array, 'sortiere_master_array);
Liebe Grüße aus Ellwangen,
Felix Riesterer.
So, habe einmal dieses hier überlegt, aber ich weiß nicht, ob das irgendwie weiterhilft...
function sortiere_descendants($desc_array1, $desc_array2) {
if (isset($desc_array1['descendants']) && is_array($desc_array1['descendants']))
$desc_array1 = sortiere_master_array($desc_array1);
if (isset($desc_array2['descendants']) && is_array($desc_array2['descendants']))
$desc_array2 = sortiere_master_array($desc_array2);
$groesser_kleiner = 0; // Wert für "gleicher Rang"
// hier die Kriterien herausfinden und vergleichen
return $groesser_kleiner;
}
function sortiere_master_array($master_array) {
if (is_isset($master_array['descendants']) && is_array($master_array['descendants'])) {
usort($master_array['descendants'], 'sortiere_descendants');
}
return $master_array;
}
$mein_ausgangs_array = sortiere_master_array($mein_ausgangs_array);
Ich habe allerdings den Verdacht, dass diese Herangehensweise extrem unperformant ist, da sie einige Arrays mehrfach sortiert... Auf die Schnelle weiß ich nur keinen besseren Ansatz.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
echo $begrüßung;
$mein_ausgangs_array = sort_array($mein_ausgangs_array);
function sort_array($arraytosort) {
usort($arraytosort, "gp_sort_dirsandfiles");
foreach($arraytosort as $key => $val) {
if($key == 'descendants' && count($val) > 1) $val = sort_array($val);
}
return $arraytosort;
}
foreach arbeitet bei $val mit einer Kopie von $arraytosort[$key]. Der Inhalt von $val wird beim nächsten Schleifendurchlauf vom nächsten Wert überschrieben. Du musst das sortierte Ergebnis selbst nach $arraytosort[$key] befördern, oder im Falle von PHP5 $val zu einer Referenz machen.
echo "$verabschiedung $name";
$begrüßung = "Hi dedlfix";
$mein_ausgangs_array = sort_array($mein_ausgangs_array);
function sort_array($arraytosort) {
usort($arraytosort, "gp_sort_dirsandfiles");
foreach($arraytosort as $key => $val) {
if($key == 'descendants' && count($val) > 1) $val = sort_array($val);
}
return $arraytosort;
}foreach arbeitet bei $val mit einer Kopie von $arraytosort[$key]. Der Inhalt von $val wird beim nächsten Schleifendurchlauf vom nächsten Wert überschrieben. Du musst das sortierte Ergebnis selbst nach $arraytosort[$key] befördern, oder im Falle von PHP5 $val zu einer Referenz machen.
Das ist ja mein Problem. Woher weiß ich (bei ja beliebiger Tiefe des Arrays), bei welchem descendants Subarray ich gerade bin, um das Ergebnis der Sortierung an die richtige Stelle des originalen Arrays zu befördern?
Gruß Gunther
hi,
Das ist ja mein Problem. Woher weiß ich (bei ja beliebiger Tiefe des Arrays), bei welchem descendants Subarray ich gerade bin, um das Ergebnis der Sortierung an die richtige Stelle des originalen Arrays zu befördern?
Das brauchst du selber nicht "wissen".
Du musst lediglich aus dem rekursiven Aufruf der Sortierfunktion heraus das sortierte Array (bzw. die sortierte Array-Kopie) wieder zurückgeben, und damit an der Stelle, wo der rekursive Aufruf gemacht wurde, damit das an dieser Stelle gerade bearbeitete Unter-Array überschreiben.
Aber man muss ja auch nicht mit Übergabe by value arbeiten, per reference dürfte wie schon erwähnt das Arbeiten mit der Kopie ersparen. dedlfix deutete ja schon, dass das unter PHP 5 mit foreach möglich ist - und für PHP liefern die Nutzerkommentare im Manual zu foreach eine Alternative mittels while, list und each, die sich auch hier als Ersatz für's foreach eignen sollte.
gruß,
wahsaga
hi,
Das ist ja mein Problem. Woher weiß ich (bei ja beliebiger Tiefe des Arrays), bei welchem descendants Subarray ich gerade bin, um das Ergebnis der Sortierung an die richtige Stelle des originalen Arrays zu befördern?
Das brauchst du selber nicht "wissen".
Du musst lediglich aus dem rekursiven Aufruf der Sortierfunktion heraus das sortierte Array (bzw. die sortierte Array-Kopie) wieder zurückgeben, und damit an der Stelle, wo der rekursive Aufruf gemacht wurde, damit das an dieser Stelle gerade bearbeitete Unter-Array überschreiben.
Wenn ich das alles lese, klingt das sehr verständlich und leuchtet mir auch alles ein ...
Aber man muss ja auch nicht mit Übergabe by value arbeiten, per reference dürfte wie schon erwähnt das Arbeiten mit der Kopie ersparen. dedlfix deutete ja schon, dass das unter PHP 5 mit foreach möglich ist - und für PHP liefern die Nutzerkommentare im Manual zu foreach eine Alternative mittels while, list und each, die sich auch hier als Ersatz für's foreach eignen sollte.
... aber wenn ich versuche, das in PHP Codezeilen zu übertragen, dann ist Feierabend. Bei dem Versuch, das ganze per Reference zu machen, kamen sehr "merkwürdige" Ergebnisse heraus.
Die besagten Userkommentare auf php.net habe ich auch schon alle durch.
Ich glaube der Hauptunterschied, oder das Hauptproblem besteht darin, dass ich jeweils ein Element in einem Array finden möchte, welches selbst wiederum ein Array ist, welches sortiert werden soll und anschließend selbst auch wiederum durchgegangen werden muss, um zu sehen, ob es noch weitere zu sortierende Arrays enthält.
Also vielen Dank für die bisherige Hilfe und Antworten - aber ich kapier's nicht, bzw. kriege es beim besten Willen nicht umgesetzt.
Helfen kann mir nur noch, wenn jemand mal so freundlich ist, und mir die paar Codezeilen (sehr viele dürften es ja nicht sein) postet.
Vorzugsweise eine Variante, die auch unter PHP 4 funktioniert.
Oder gibt es vielleicht einen ganz anderen (einfacheren/ besseren) Ansatz?
Das Array bildet eine Verzeichnisstruktur ab, ausgehend von einem bestimmten Ausgangsverzeichnis. Bevor daraus ein HTML Menü generiert wird, muss das ganze halt noch nach bestimmten Kriterien sortiert werden (jeweils pro Ast).
gruß,
wahsaga
Gruß Gunther
hi,
Oder gibt es vielleicht einen ganz anderen (einfacheren/ besseren) Ansatz?
Das Array bildet eine Verzeichnisstruktur ab, ausgehend von einem bestimmten Ausgangsverzeichnis.
Und wie wird es erzeugt? Da dürfte doch auch schon Rekursion im Spiel sein, oder?
Warum wird es dann nicht eigentlich schon beim Erzeugen sortiert?
gruß,
wahsaga
Hi!
Oder gibt es vielleicht einen ganz anderen (einfacheren/ besseren) Ansatz?
Das Array bildet eine Verzeichnisstruktur ab, ausgehend von einem bestimmten Ausgangsverzeichnis.Und wie wird es erzeugt? Da dürfte doch auch schon Rekursion im Spiel sein, oder?
Natürlich ... ;)
Das ist die Funktion, mit der ich das Array erzeuge:
function gp_GetFileSystemStructure($dir='', $level=0) {
global $conf, $data_old;
$base=$conf['datadir'];
$dirlist = opendir($base.$dir);
while ($file = readdir ($dirlist)) {
if(preg_match('/^[\._]/',$file)) continue; //skip hidden files and upper dirs
$newpath = $dir.'/'.$file;
if (is_dir($base.$newpath)) {
$id = cleanID($dir.'/'.$file);
$pagetitle = $file;
if($conf['navmenu']['removesepchar']) $pagetitle = str_replace($conf['sepchar'], " ", $pagetitle);
if($conf['navmenu']['firstlettertoupper']) $pagetitle = ucwords($pagetitle);
$metatitle = p_get_metadata($id.':'.$conf['navmenu']['namespaceindex'], 'title');
if($conf['navmenu']['menutitle'] && $data_old[$id]['sort']) $sortvalue = $data_old[$id]['sort'];
else {
if($conf['useheading'] && $metatitle) $sortvalue = $metatitle;
else $sortvalue = $pagetitle;
}
$rawdata[] = array(
'id'=>$id,
'level'=>$level,
'filetype'=>'d',
'name'=>$file,
'title'=>array($pagetitle, $metatitle, $data_old[$id]['title'][2]),
'sort'=>$sortvalue,
'descendants'=>gp_GetFileSystemStructure($newpath, $level+1),
);
}
else {
if(substr($file, -4) == '.txt') {
$id = substr(cleanID($dir.'/'.$file), 0, -4);
$pagename = substr($file, 0, -4);
$pagetitle = $pagename;
if($conf['navmenu']['removesepchar']) $pagetitle = str_replace($conf['sepchar'], " ", $pagetitle);
if($conf['navmenu']['firstlettertoupper']) $pagetitle = ucwords($pagetitle);
$metatitle = p_get_metadata($id, 'title');
if($conf['navmenu']['menutitle'] && $data_old[$id]['sort']) $sortvalue = $data_old[$id]['sort'];
else {
if($conf['useheading'] && $metatitle) $sortvalue = $metatitle;
else $sortvalue = $pagetitle;
}
$rawdata[] = array(
'id'=>$id,
'level'=>$level,
'filetype'=>'f',
'name'=>$pagename,
'title'=>array($pagetitle, $metatitle, $data_old[$id]['title'][2]),
'sort'=>$sortvalue,
);
}
}
}
closedir($dirlist);
return $rawdata;
}
Warum wird es dann nicht eigentlich schon beim Erzeugen sortiert?
Ja gute Idee. Und wo müsste ich dann da einhaken, um es zu sortieren?
Dein Vorschlag wirft bei mir die Frage auf, wie ich etwas in Abhängigkeit voneinander sortieren soll, bevor alle Elemente vorhanden sind? Und das ist ja erst der Fall, wenn die Funktion vollständig durchlaufen wurde, oder?
gruß,
wahsaga
Gruß Gunther
hi,
Ja gute Idee. Und wo müsste ich dann da einhaken, um es zu sortieren?
Wie viel verstehst du denn von der Funktionsweise des Codes, den du da vorliegen hast?
Dein Vorschlag wirft bei mir die Frage auf, wie ich etwas in Abhängigkeit voneinander sortieren soll, bevor alle Elemente vorhanden sind?
Wenn ich richtig verstanden habe, willst du doch nur jeweils innerhalb einer Ebene eine Sortierung herstellen, oder?
Und das ist ja erst der Fall, wenn die Funktion vollständig durchlaufen wurde, oder?
Eine Verzeichnisebene ist von diesem Script komplett abgearbeitet, wenn die While-Schleife zum Ende gekommen ist. Also wäre danach ein guter Zeitpunkt zum Sortieren, wenn sich die Sortierung wie gesagt auf diese Ebene beziehen soll.
gruß,
wahsaga
hi,
Ja gute Idee. Und wo müsste ich dann da einhaken, um es zu sortieren?
Wie viel verstehst du denn von der Funktionsweise des Codes, den du da vorliegen hast?
Ob du es glaubst oder nicht - den verstehe ich voll und ganz (ist ja auch von mir).
Dein Vorschlag wirft bei mir die Frage auf, wie ich etwas in Abhängigkeit voneinander sortieren soll, bevor alle Elemente vorhanden sind?
Wenn ich richtig verstanden habe, willst du doch nur jeweils innerhalb einer Ebene eine Sortierung herstellen, oder?
Und das ist ja erst der Fall, wenn die Funktion vollständig durchlaufen wurde, oder?
Eine Verzeichnisebene ist von diesem Script komplett abgearbeitet, wenn die While-Schleife zum Ende gekommen ist. Also wäre danach ein guter Zeitpunkt zum Sortieren, wenn sich die Sortierung wie gesagt auf diese Ebene beziehen soll.
Du meinst einen Ast des Verzeichnisbaums!? Und der kann ja auch bereits von beliebiger Tiefe sein, womit sich beim Sortieren genau das selbe Problem ergibt.
gruß,
wahsaga
Gruß Gunther
hi,
Also wäre danach ein guter Zeitpunkt zum Sortieren, wenn sich die Sortierung wie gesagt auf diese Ebene beziehen soll.
Du meinst einen Ast des Verzeichnisbaums!? Und der kann ja auch bereits von beliebiger Tiefe sein, womit sich beim Sortieren genau das selbe Problem ergibt.
Nach mal die Frage: Worauf soll sich die Sortierung beziehen?
Wenn du lediglich jeweils die Elemente auf einer Ebene sortiert haben willst (Was eigentlich sonst? Sortierung über mehrere Ebenen stelle ich mir schwierig überhaupt sinnvoll zu definieren vor.), dann ist das eine geeignete Stelle dafür.
gruß,
wahsaga
Hi,
Also wäre danach ein guter Zeitpunkt zum Sortieren, wenn sich die Sortierung wie gesagt auf diese Ebene beziehen soll.
Du meinst einen Ast des Verzeichnisbaums!? Und der kann ja auch bereits von beliebiger Tiefe sein, womit sich beim Sortieren genau das selbe Problem ergibt.
Nach mal die Frage: Worauf soll sich die Sortierung beziehen?
Wenn du lediglich jeweils die Elemente auf einer Ebene sortiert haben willst, dann ist das eine geeignete Stelle dafür.
du hast ja völlig recht. Ich war gestern wohl gedanklich schon so vernagelt, aufgrund der Tatsache, dass ich es nicht hinbekommen habe, dieses Array automatisch zu durchlaufen und dabei zu sortieren, dass der Rest auch nicht mehr richtig funktionierte.
Also ich lasse mein Array jetzt schön brav nach jedem Durchlauf sortieren, und das funktioniert wunderbar.
Trotzdem wurmt mich das, dass ich es anders nicht hinbekommen habe. Wenn einer ein gutes Tutorial bezüglich Iteration und Rekursion im Bezug auf Arrays in PHP kennt, wäre es nett, wenn er den Link posten würde - Danke!
Auch die Sache mit der Referenz in PHP 5 muss ich mir mal genauer anschauen.
Also Danke nochmal und entschuldige bitte meine "Begriffstutzigkeit" - aber wenn erstmal der Wurm drin ist ... ;)
Gruß Gunther
echo $begrüßung;
Trotzdem wurmt mich das, dass ich es anders nicht hinbekommen habe. Wenn einer ein gutes Tutorial bezüglich Iteration und Rekursion im Bezug auf Arrays in PHP kennt, wäre es nett, wenn er den Link posten würde - Danke!
Du hast es doch schon fast hinbekommen gehabt.
$mein_ausgangs_array = sort_array($mein_ausgangs_array);
function sort_array($arraytosort) {
usort($arraytosort, "gp_sort_dirsandfiles");
foreach($arraytosort as $key => $val) {
if($key == 'descendants' && count($val) > 1) $val = sort_array($val);
}
return $arraytosort;
}
$val ist eine Kopie. Das Original ist $arraytosort[$key]. Da muss das Ergebnis von sort_array($val) rein. Also statt
$val = sort_array($val);
schreibst du
$arraytosort[$key] = sort_array($val);
und alles wird gut.
Auch die Sache mit der Referenz in PHP 5 muss ich mir mal genauer anschauen.
Das ist recht einfach. Bei foreach($array as $key => $val) setzt man vor das $val ein & und damit ist $val eine Referenz auf $array[$key]. (Das "$key =>" kann man auch weglassen, wenn man den Schlüssel, anders als in deinem Fall, nicht benötigt.)
echo "$verabschiedung $name";
echo $begrüßung;
Trotzdem wurmt mich das, dass ich es anders nicht hinbekommen habe. Wenn einer ein gutes Tutorial bezüglich Iteration und Rekursion im Bezug auf Arrays in PHP kennt, wäre es nett, wenn er den Link posten würde - Danke!
Du hast es doch schon fast hinbekommen gehabt.
$mein_ausgangs_array = sort_array($mein_ausgangs_array);
function sort_array($arraytosort) {
usort($arraytosort, "gp_sort_dirsandfiles");
foreach($arraytosort as $key => $val) {
if($key == 'descendants' && count($val) > 1) $val = sort_array($val);
}
return $arraytosort;
}
>
> $val ist eine Kopie. Das Original ist $arraytosort[$key]. Da muss das Ergebnis von sort\_array($val) rein. Also statt
>
> $val = sort\_array($val);
>
> schreibst du
>
> $arraytosort[$key] = sort\_array($val);
>
> und alles wird gut.
>
> > Auch die Sache mit der Referenz in PHP 5 muss ich mir mal genauer anschauen.
>
> Das ist recht einfach. Bei foreach($array as $key => $val) setzt man vor das $val ein & und damit ist $val eine Referenz auf $array[$key]. (Das "$key =>" kann man auch weglassen, wenn man den Schlüssel, anders als in deinem Fall, nicht benötigt.)
>
Also nachdem ich es heute morgen dann ja schon geschafft hatte, die Sortierung direkt bei der Erstellung des Arrays vorzunehmen, habe ich es jetzt auch geschafft, das fertige Array zu sortieren.
~~~php
$dircount = count($mein_ausgangs_array);
for($i=0; $i<$dircount; $i++) {
if($mein_ausgangs_array[$i]['filetype'] == 'd' && $mein_ausgangs_array[$i]['desc']) $mein_ausgangs_array[$i]['desc'] = sort_array($mein_ausgangs_array[$i]['desc']);
}
function sort_array(&$arraytosort) {
if(!is_array($arraytosort) || !count($arraytosort)) return;
uasort($arraytosort, "gp_sort_dirsandfiles");
if($conf['navmenu']['dirsbeforefiles']) usort($arraytosort, "gp_sort_dirsbeforefiles");
foreach($arraytosort as $key => $val) {
if($arraytosort[$key]['desc']) $arraytosort[$key]['desc'] = sort_array($arraytosort[$key]['desc']);
}
return $arraytosort;
}
Das funktioniert jetzt zumindest mit PHP 5 wie gewünscht, da ich der Funktion sort_array ja jetzt eine Referenz auf das originale Ausgangsarray übergebe.
Wie könnte ich das denn jetzt noch so umschreiben, dass es zumindest auch mit PHP 4 funktioniert?
Mühsam ernährt sich das Eichhörnchen - zwar langsam, aber dafür sicher, geht es voran.
Vielen dank nochmal für eure bisherige Hilfe, wobei manchmal so eine Codezeile wie hier von dedlfix gepostet, wesentlich mehr beim Verstehen hilft, als tausend Worte ;).
Gruß Gunther
PS: Ist eigentlich die "Mail bei Antwort" Funktion hier im Forum kaputt (oder liegt es vielleicht doch an meinem Junkfilter!?)? Ich erhalte nämlich keine Benachrichtigungen.
Hallo nochmal!
$val ist eine Kopie. Das Original ist $arraytosort[$key]. Da muss das Ergebnis von sort_array($val) rein. Also statt
$val = sort_array($val);
schreibst du
$arraytosort[$key] = sort_array($val);
und alles wird gut.
Also nachdem ich es heute morgen dann ja schon geschafft hatte, die Sortierung direkt bei der Erstellung des Arrays vorzunehmen, habe ich es jetzt auch geschafft, das fertige Array zu sortieren.
$dircount = count($mein_ausgangs_array);
for($i=0; $i<$dircount; $i++) {
if($mein_ausgangs_array[$i]['filetype'] == 'd' && $mein_ausgangs_array[$i]['desc']) $mein_ausgangs_array[$i]['desc'] = sort_array($mein_ausgangs_array[$i]['desc']);
}function sort_array($arraytosort) {
if(!is_array($arraytosort) || !count($arraytosort)) return;
uasort($arraytosort, "gp_sort_dirsandfiles");
if($conf['navmenu']['dirsbeforefiles']) usort($arraytosort, "gp_sort_dirsbeforefiles");
foreach($arraytosort as $key => $val) {
if($arraytosort[$key]['desc']) $arraytosort[$key]['desc'] = sort_array($arraytosort[$key]['desc']);
}
return $arraytosort;
}
So, kleine Korrektur!
Funktioniert auch so, da ich ja nicht mit der Kopie von foreach arbeite, sondern jeweils mit dem originalen Array.
Gruß Gunther