我需要对表示文件系统结构的多维数组进行排序。如何按目录的键和文件名的值对目录进行排序?
[
'dir1' => [
'dir2' => [
'dir3' => [
'dir4' => [
'file1.php',
'abc.php'
]
],
'file2.php',
'abc.php'
]
],
'abc' => [
'abc' => [
'abc' => [
'file5.php'
]
]
]
]
将 mulsort 函数开头的 sort($a) 替换为 ksort($a)
编辑:抱歉,只需将 mulsort 代码更改为:
function mulsort(&$a)
{
ksort($a);
foreach($a as &$value)
if (is_array($value))
mulsort($value);
}
要对可变深度结构进行排序,请使用递归遍历所有级别。识别目录,不是通过它们的键,而是通过它们的值数据类型——如果是数组,那么它是一个需要按键自然排序的目录。如果处理叶节点,则不需要保留索引,并且值应该自然排序。
通过分离两种项目类型,正确排序很简单。对每个“桶”进行排序后,将它们合并在一起以覆盖
$array
。请注意,如果您有一个名为 0
的目录,那么此数字键将提高同一目录中任何索引键控文件的起点。
这将以逻辑且人性化的方式呈现您的目录和文件。
代码:(演示)
function sortFileSystem(array &$array)
{
$dirs = [];
$files = [];
foreach ($array as $k => &$v) {
if (is_array($v)) {
(__FUNCTION__)($v); // recurse
$dirs[$k] = $v; // preserve key
} else {
$files[] = $v; // key is unneeded
}
}
ksort($dirs, SORT_NATURAL);
sort($files, SORT_NATURAL);
$array = array_merge($dirs, $files); // put dirs before files
}
sortFileSystem($array);
var_export($array);