在计算机上按类似键的文件名对关联数组进行排序



我有以下结构:

$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] ?? '');
});

小提琴

相关内容

  • 没有找到相关文章

最新更新