php - 多维数组目录映射

标签 php multidimensional-array directory directory-structure

我正在尝试获取多维数组中的目录结构。

我做到了这一点:

function dirtree($dir, $regex = '', $ignoreEmpty = false)
{
    if (!$dir instanceof DirectoryIterator) {
        $dir = new DirectoryIterator((string) $dir);
    }
    $dirs = array();
    $files = array();
    foreach ($dir as $node) {
        if ($node->isDir() && !$node->isDot()) {
            $tree = dirtree($node->getPathname(), $regex, $ignoreEmpty);
            if (!$ignoreEmpty || count($tree)) {
                $dirs[$node->getFilename()] = $tree;
            }
        } elseif ($node->isFile()) {
            $name = $node->getFilename();
            if ('' == $regex || preg_match($regex, $name)) {
                $files[] = $name;
            }
        }
    }
    asort($dirs);
    sort($files);
    return array_merge($dirs, $files);
}

但我在获取文件夹名称而不是索引 0,1 等时遇到问题。 这似乎是因为我的目录有数字名称?

Array
(
    [0] => Array  // 0 should be the folder name
        (
            [0] => m_109225488_1.jpg
            [1] => t_109225488_1.jpg
        )

    [1] => Array
        (
            [0] => m_252543961_1.jpg
            [1] => t_252543961_1.jpg
        )

最佳答案

解决方案相当简单,感谢:Merge array without loss key index

代替 array_merge 只需执行 $dirs + $files

潜在解决方案(Roger Gee 指出的潜在问题):

function dirtree($dir, $regex = '', $ignoreEmpty = false)
{
    if (!$dir instanceof DirectoryIterator) {
        $dir = new DirectoryIterator((string) $dir);
    }
    $dirs = array();
    $files = array();
    foreach ($dir as $node) {
        if ($node->isDir() && !$node->isDot()) {
            $tree = dirtree($node->getPathname(), $regex, $ignoreEmpty);
            if (!$ignoreEmpty || count($tree)) {
                $dirs[$node->getFilename()] = $tree;
            }
        } elseif ($node->isFile()) {
            $name = $node->getFilename();
            if ('' == $regex || preg_match($regex, $name)) {
                $files[] = $name;
            }
        }
    }
    return $dirs + $files;
}

更好的解决方案?

function dirtree($dir, $regex = '', $ignoreEmpty = false)
{
    if (!$dir instanceof DirectoryIterator) {
        $dir = new DirectoryIterator((string) $dir);
    }
    $filedata = array();
    foreach ($dir as $node) {
        if ($node->isDir() && !$node->isDot()) {
            $tree = dirtree($node->getPathname(), $regex, $ignoreEmpty);
            if (!$ignoreEmpty || count($tree)) {
                $filedata[$node->getFilename()] = $tree;
            }
        } elseif ($node->isFile()) {
            $name = $node->getFilename();
            if ('' == $regex || preg_match($regex, $name)) {
                $filedata[] = $name;
            }
        }
    }
    return $filedata;
}

关于php - 多维数组目录映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45382701/

相关文章:

PHP水印图片

c++ - 使用私有(private)对象变量时如何稍后初始化数组(初始化对象后)

java 如何在同名目录中创建.txt

php - 将 Paypal IPN 变量打印到屏幕

javascript - 根据数字输入计算总计并设置为数字输入

javascript - 多维 JavaScript 数组语法?

matlab - 如何将起始目录(在 Matlab 中使用 uigetfile)设置为 'Computer'?

android - android studio中布局的子文件夹

php - 正则表达式查找以空格分隔的连续新行

python - 对二维 numpy 数组进行子集化