【问题标题】:Using a Multidimensional Associative Array to create a Windows Directory Structure使用多维关联数组创建 Windows 目录结构
【发布时间】:2021-09-09 14:16:48
【问题描述】:

我有一个表示目录结构的多维关联数组。结构信息是从带有parent_ids 的数据库中提取的,以指示层次结构。

我已经成功地从数据库中获取了行并排序到一个类似这样的数组中:

Array
(
    [1] => Array
        (
            [fold_id] => 1
            [fold_name] => Preliminary
            [seq] => 1
            [parent_id] => 0
            [generation] => 1
            [ext_name] => 1 Preliminary
            [children] => Array
                (
                    [9] => Array
                        (
                            [fold_id] => 9
                            [fold_name] => Programming
                            [seq] => 3
                            [parent_id] => 1
                            [generation] => 2
                            [ext_name] => 1.3 Programming
                            [children] => Array
                                (
                                    [10] => Array
                                        (
                                            [fold_id] => 10
                                            [fold_name] => Feasibility Study
                                            [seq] => 
                                            [parent_id] => 9
                                            [generation] => 3
                                            [ext_name] => Feasibility Study
                                        )

                                    [11] => Array
                                        (
                                            [fold_id] => 11
                                            [fold_name] => Field Investigation
                                            [seq] => 
                                            [parent_id] => 9
                                            [generation] => 3
                                            [ext_name] => Field Investigation
                                        )
                                )
                        )
                )           
        )

    [2] => Array
        (
            [fold_id] => 2
            [fold_name] => Construction Documents
            [seq] => 2
            [parent_id] => 0
            [generation] => 1
            [ext_name] => 2 Construction Documents
            [children] => Array
                (
                    [12] => Array
                        (
                            [fold_id] => 12
                            [fold_name] => Code
                            [seq] => 1
                            [parent_id] => 2
                            [generation] => 2
                            [ext_name] => 2.1 Code
                        )

                    [13] => Array
                        (
                            [fold_id] => 13
                            [fold_name] => Drawing
                            [seq] => 2
                            [parent_id] => 2
                            [generation] => 2
                            [ext_name] => 2.2 Drawing
                            [children] => Array
                                (
                                    [17] => Array
                                        (
                                            [fold_id] => 17
                                            [fold_name] => Families
                                            [seq] => 
                                            [parent_id] => 13
                                            [generation] => 3
                                            [ext_name] => Families
                                        )
                                )
                            
                        )

                    [14] => Array
                        (
                            [fold_id] => 14
                            [fold_name] => Specs
                            [seq] => 3
                            [parent_id] => 2
                            [generation] => 2
                            [ext_name] => 2.3 Specs
                            [children] => Array
                                (
                                    [19] => Array
                                        (
                                            [fold_id] => 19
                                            [fold_name] => Cut Sheets
                                            [seq] => 
                                            [parent_id] => 14
                                            [generation] => 3
                                            [ext_name] => Cut Sheets
                                        )

                                    [20] => Array
                                        (
                                            [fold_id] => 20
                                            [fold_name] => Front-End Documents
                                            [seq] => 
                                            [parent_id] => 14
                                            [generation] => 3
                                            [ext_name] => Front-End Documents
                                        )
                                )
                        )
                )      
        )
)

每个子数组中的ext_name 键是实际的文件夹名称。我需要做的是获取这个数组并使用mkdir() 从中创建一个实际的目录结构。

我已经通过为每个嵌套代硬编码一个 foreach 循环来做到这一点,但我想以某种方式做到这一点,允许结构更改而无需更新我的代码,以适应更多代,例如。

你们中的任何 php 大师有更优雅的解决方案吗?

谢谢!!! 马特

【问题讨论】:

    标签: php arrays loops directory mkdir


    【解决方案1】:

    这就是我想出的。似乎工作!我愿意改进!!!

    function make_paths(&$tree, $parentPath = '') {
        $pathed = array();
    
        foreach ($tree AS &$branch) {
    
            if ( strlen($parentPath) ) {
                $path = $parentPath.'/'.$branch['ext_name'];
            } else {
                $path = $branch['ext_name'];
            }
    
            if ( array_key_exists('children', $branch) ) {
                $children = make_paths( $branch['children'], $path );
                $pathed[] = $path;
                $pathed[] = $children;
            } else {
                $pathed[] = $path;
            }
    
            unset($branch);
        }
        return $pathed;
    }
    

    然后我只是使用array_walk_recursive() 来获取路径并制作文件夹。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多