Lieber tami,
das hast du ja bestimmt im verlinkten PHP-Man gesehen und hilft dir nicht:
<?php
$array[0] = array('key_a' => 'z', 'key_b' => 'c');
$array[1] = array('key_a' => 'x', 'key_b' => 'b');
$array[2] = array('key_a' => 'y', 'key_b' => 'a');function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}usort($array, build_sorter('key_b'));
foreach ($array as $item) {
echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}
ich hatte sie schlicht nicht verstanden! Aber nachdem Du Tom hier das mit dem "use()" in "PHP-Closures" [erklärt](https://forum.selfhtml.org/?t=217315&m=1492340) hattest, habe ich es nun geblickt und konnte es erfolgreich einsetzen:
~~~php
// in einer Methode:
uksort($files, $t->sort_dirs_first($files));
// ...
}
public function sort_dirs_first ($files) {
return function ($a, $b) use ($files) {
if (is_array($files[$a]) && is_string($files[$b])) {
return -1;
}
if (is_string($files[$a]) && is_array($files[$b])) {
return 1;
}
return strnatcasecmp($a, $b);
};
}
Mit uksort wird wie erwartet ein zu vergleichendes Paar an Schlüsseln an die Callback-Funktion übertragen. Aber da wir die Callback-Funktion nicht (wie schon zu PHP4-Zeiten) als String-Wert ins zweite Argument schreiben, sondern einen Methodenaufruf (siehe "sort_dirs_first"), können wir eine PHP-Closure bauen. Durch den Methodenaufruf übergeben wir einfach das zu sortierende Array, welches dann als eingekapselte Variable (hier kommt dieses "use()" zum Einsatz) unser Array enthält und damit die Werte erreichbar macht (siehe $files[$a] bzw. $files[b]).
Herzlichen Dank!! Ohne diese Diskussion hätte ich die Lösung nicht erkannt, obwohl sie im PHP-Manual ja klar notiert war!
Liebe Grüße,
Felix Riesterer.
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)