对表示文件系统的多维数组进行递归排序,其中目录作为键,文件名作为索引子数组

问题描述 投票:0回答:2

我需要对表示文件系统结构的多维数组进行排序。如何按目录的键和文件名的值对目录进行排序?

[
    'dir1' => [
        'dir2' => [
            'dir3' => [
                'dir4' => [
                    'file1.php',
                    'abc.php'
                ]
            ],
            'file2.php',
            'abc.php'
        ]
    ],
    'abc' => [
        'abc' => [
            'abc' => [
                'file5.php'
            ]
        ]
    ]
]
php arrays sorting multidimensional-array filesystems
2个回答
3
投票

http://php.net/sort#51088

将 mulsort 函数开头的 sort($a) 替换为 ksort($a)

编辑:抱歉,只需将 mulsort 代码更改为:

function mulsort(&$a)
{
 ksort($a);
 foreach($a as &$value)
    if (is_array($value))
        mulsort($value);
}

0
投票

要对可变深度结构进行排序,请使用递归遍历所有级别。识别目录,不是通过它们的键,而是通过它们的值数据类型——如果是数组,那么它是一个需要按键自然排序的目录。如果处理叶节点,则不需要保留索引,并且值应该自然排序。

通过分离两种项目类型,正确排序很简单。对每个“桶”进行排序后,将它们合并在一起以覆盖

$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);
© www.soinside.com 2019 - 2024. All rights reserved.