我知道我对问题的描述不够好,但是我想创建一个“嵌套数组”,如您所见:
文件夹/->文件夹/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;
}
我知道我做错了,我不确定为什么...我该如何解决?
答案 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