У меня есть следующая структура:
$arr = [
'children' => [
'align.php' => [],
'default.php' => [],
'test.php' => [],
'default-2.php' => [],
]
]
В настоящее время я использую
ksort($arr['children'])
и сортирует так:
$arr = [
'children' => [
'align.php' => [],
'default-2.php' => [],
'default.php' => [],
'test.php' => [],
]
]
Однако мне нужно, чтобы массив был в следующем порядке:
$arr = [
'children' => [
'align.php' => [],
'default.php' => [],
'default-2.php' => [],
'test.php' => [],
]
]
Я пробовал флаг NATURAL_SORT, но это не сработало. Какие еще есть варианты?
По какой-то причине natsort выдает мне ошибку «Преобразование массива в строку»
Вы можете извлечь имена файлов с помощью функции информация о пути, а затем сравнить их в функции обратного вызова в функции уксорт.
uksort($arr['children'], function($a, $b){
$a = pathinfo($a);
$b = pathinfo($b);
return $a['filename'] == $b['filename'] ?
$a['basename'] <=> $b['basename'] :
$a['filename'] <=> $b['filename'];
});
Решается более сложная сортировка имен файлов с несколькими точками, например, вот так
/* Example:
a
a.class
a.class.php
a.class.php-1
a.class-1.php
a.class-1.php-1
a-1
a-1.class.php
a-1.class-1
a-1.class-1.php-1
*/
uksort($arr['children'], function($a, $b){
$a = explode('.', $a);
$b = explode('.', $b);
$s = '';
$i = 0;
while (isset($a[$i]) && isset($b[$i]) && $a[$i] == $b[$i]) {
$s .= $a[$i++] . '.';
}
return $s . ($a[$i] ?? '') <=> $s . ($b[$i] ?? '');
});