如何在数组中创建层次结构?

时间:2019-03-26 20:02:06

标签: php

我知道我对问题的描述不够好,但是我想创建一个“嵌套数组”,如您所见:

  

文件夹/->文件夹/file.txt,文件夹/文件夹2 /->文件夹/文件夹2 / file.txt,文件夹/文件夹2 /文件夹3 /->等等

但是,我得到了:

E:\wamp\www\index.php:31:
array (size=3)
  'folder/' => 
    array (size=1)
      0 => string 'folder/file.txt' (length=15)
  'folder/folder2/' => 
    array (size=1)
      0 => string 'folder/folder2/file.txt' (length=23)
  'folder/folder2/folder3/' => 
    array (size=1)
      0 => string 'folder/folder2/folder3/file.txt' (length=31)

我的代码是:

$array = [
    'folder/',
    'folder/folder2/folder3/',
    'folder/folder2/',
    'folder/folder2/folder3/file.txt',
    'folder/folder2/file.txt',
    'folder/file.txt'
];
sort($array);
$array = array_flip($array);
function recursive_dir_nested($a) {
    foreach ($a as $k => $v) {
        if (preg_match("/\/$/", $k)) {
            $a[$k] = [];
        }

        if (preg_match("/\/[^\/]+$/", $k)) {
            $nk = preg_replace("/\/[^\/]+$/", "/", $k);
            if (array_key_exists($nk, $a)) {
                $a[$nk][] = $k;
                unset($a[$k]);
            } else {
                recursive_dir_nested($a);
            }
        }
    }

    return $a;
}

我知道我做错了,我不确定为什么...我该如何解决?

2 个答案:

答案 0 :(得分:1)

不确定使用正则表达式是否是最佳方法。这建立在另一个答案PHP - Make multi-dimensional associative array from a delimited string的基础上,但增加了使用条目数组的想法。需要注意的一件事是,当添加新条目时,如果该元素当前不是数组,它将变成一个数组,以便它可以包含多个条目(if ( !is_array($current) ) {部分)。

它使用每个字符串并从中构建文件夹层次结构,将最后一部分另存为要专门添加到文件夹元素的文件名...

$array = [
    'folder/',
    'folder/folder2/folder3/',
    'folder/folder2/',
    'folder/folder2/folder3/file.txt',
    'folder/folder2/file.txt',
    'folder/file.txt'
];
sort($array);

$output = [];
foreach ( $array as $entry )   {
    $split = explode("/", $entry);
    $current = &$output;
    $file = array_pop($split);
    foreach ( $split as $level )    {
        if ( !isset($current[$level]) ){
            if ( !is_array($current) )  {
                $current = [ $current ];
            }
            $current[$level] = [];
        }
        $current = &$current[$level];
    }
    if ( !empty($file) )    {
        $current = $file;
    }
}

print_r($output);

这给你...

Array
(
    [folder] => Array
        (
            [0] => file.txt
            [folder2] => Array
                (
                    [0] => file.txt
                    [folder3] => file.txt
                )

        )

)

答案 1 :(得分:0)

您可以在PHP中嵌套数组。您可能还想使用密钥作为目录名称:

$array = [
    'folder' => [
        'folder2' => [
            'folder3' => [
                'file.txt'
            ],
            'file.txt'
        ],
        'file.txt'
    ]
];

您可以使用is_array()检查每个项目本身是否为数组,如果不是,则将其视为字符串。

有关更多信息,请参见此处:php.net/manual/en/language.types.array.php