PHP 如何无限极数组映射成文件夹?

作者站长头像
站长
· 阅读数 6

再生产项目中碰到一个配置文件转换问题,读取配置文件,并自动生成出目录:云存储使用的。

$config = [
    'uuid'=>'string',
    'info'=>'string',
    'main'=>[
        'uuid'=>'string',
        'cmd'=>'string',
        'child'=>[
            'uuid'=>'string',
            'remark'=>'string',
            'game'=>[
                'user'=>'name',
                'money'=>'1000'
            ]
        ],
        'logs'=>[
            'path'=>'/path/path',
            'date'=>'2023-09-01'        
        ]
    ],
    'video'=>[
        'uuid'=>'vid',
        'info'=>'info',
        'file'=>[
            'size'=>'12900'
        ]
    ]
];

以上是配置文件的一部分:现在需要根据配置生成目录,只考虑键值为数组的情况键值字符串是文件的属性。

$list = [
    'main',
    'main/child',
    'main/child/game',
    'main/logs',
    'video',
    'video/file',
    ...
];

我考虑扁平化new RecursiveIteratorIterator(new RecursiveArrayIterator($sqlite)); foreach 递归 都没弄成功。请求高手给解!

回复
1个回答
avatar
test
2024-06-27

好久没写 PHP 了,有点儿生疏,看看大概意思就行了:

function flatten($nodes, $prefix = '') {
    $list = [];
    
    foreach ($nodes as $key => $value) {
        if (is_array($value)) {
            $path = $prefix . $key;
            $list[] = $path;
            $list = array_merge($list, flatten($value, $path . '/'));
        }
    }
    
    return $list;
}

flatten($config);

answer image


用 RecursiveIteratorIterator 也行,但需要指定第二个参数 RecursiveIteratorIterator::SELF_FIRST

$list = [];
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($config), RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $key => $value) {
    if (is_array($value)) {
        $path = '';
        foreach (range(0, $iterator->getDepth()) as $depth) {
            $path .= $iterator->getSubIterator($depth)->key() . '/';
        }
        $list[] = rtrim($path, '/');
    }
}

answer image

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容