我有以下结构:
$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标志,但没有成功。还有什么其他选择?
您可以使用pathinfo函数提取文件名,然后在uksort函数的回调函数中进行比较。
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] ?? '');
});
小提琴