从文件夹列表递归地创建文件夹数组
问题描述:
我无法从文件夹数组创建文件夹结构类数组。从文件夹列表递归地创建文件夹数组
这是函数接收
Array
(
[0] => Array
(
[id] => 6
[name] => 2011
[parent_folder] => 1
)
[1] => Array
(
[id] => 5
[name] => 2012
[parent_folder] => 1
)
[2] => Array
(
[id] => 7
[name] => April
[parent_folder] => 6
)
[3] => Array
(
[id] => 2
[name] => Folder2
[parent_folder] =>
)
[4] => Array
(
[id] => 1
[name] => Folder1
[parent_folder] =>
)
)
阵列
输出应该其中子文件夹下的partent_folder的阵列
Array
(
[0] => Array
(
[id] => 2
[name] => Folder2
[parent_folder] =>
)
[1] => Array
(
[id] => 1
[name] => Folder1
[parent_folder] =>
[content] => Array
(
[0] => Array
(
[id] => 6
[name] => 2011
[parent_folder] => 1
[content] => Array
(
[0] => Array
(
[id] => 7
[name] => April
[parent_folder] => 6
)
)
)
[1] => Array
(
[id] => 5
[name] => 2012
[parent_folder] => 1
)
)
)
)
我试图围绕内的关键“内容”存储为数组的数组但不能让它工作。必须有一个递归的方式来重新排列数组。任何人都可以帮忙吗? 将不胜感激!
答
你需要的东西设置是这样的:
function look_through_array($array) {
for ($i=0; $i<sizeof($array); $i++) {
if (is_array($array[$i]))
look_through_array($array[$i]);
else
create_folder($array[$i]);
}
}
function create_folder($array) {
# make a folder
}
答
比方说,你原来的数组被称为
$tree;
每个元素在里面是一个数组,有三个已命名的条目:
-
id
- 代表自己 - 进一步称为$idName
, -
name
- 一些字符串 - 名为$parentName
进一步, -
parent
- 代表母公司 - 进一步名为$childrenName
从平成移调树,每个孩子必须能够解决它的父。因此,创建一个临时数组,通过它的id为每个树元素都有一个别名。我的名字是不久$t
和创建它:
foreach ($tree as $k => $v)
$t[$v[$idName]] = &$tree[$k];
由于现在孩子们可以分配给它的父(如果家长不FALSE
)感谢这个别名表,重新安排是相当直截了当:
foreach ($tree as $k => $v)
if (($p = $v[$parentName]) && ($t[$p][$childrenName][] = &$t[$v[$idName]]))
unset($tree[$k]);
后这样做了,不需要别名表中的任何时间更长,可以取消设置:
unset($t);
的瞧,树已准备就绪:
var_dump($tree);
输出:
array(2) {
[3]=> array(3) {
["id"]=> string(1) "2"
["name"]=> string(7) "Folder2"
["parent_folder"]=> NULL
}
[4]=> array(4) {
["id"]=> string(1) "1"
["name"]=> string(7) "Folder1"
["parent_folder"]=> NULL
["content"]=> array(2) {
[0]=> array(4) {
["id"]=> string(1) "6"
["name"]=> string(4) "2011"
["parent_folder"]=> string(1) "1"
["content"]=> array(1) {
[0]=> array(3) {
["id"]=> string(1) "7"
["name"]=> string(5) "April"
["parent_folder"]=> string(1) "6"
}
}
}
[1]=> array(3) {
["id"]=> string(1) "5"
["name"]=> string(4) "2012"
["parent_folder"]=> string(1) "1"
}
}
}
}
答
我知道这个问题是旧的,但所提供的答案并没有为我工作。解决方案的第一部分来自hakre的答案。这是我最终做的:
global $t;
foreach ($tree as $key => $value){
$idName = $value['id'];
$t[$idName] = $tree[$key];
}
foreach ($t as $key => $value){
//echo $value['name'] . '<br />';
$t[$key]['uri'] = recursiveArray($value).'/'.$value['name'];
//echo '<br />';
}
function recursiveArray($value) {
global $t;
if ($value['parentId'] != 0){
$parentName = $t[$value['parentId']]['name'];
//$parentId = $value['parentId'];
return recursiveArray($t[$value['parentId']]).'/'.$parentName;
}
return '';
}
tree
是一个数组,看起来就像OP的数组。结果是不同的,因为替代嵌套数组,嵌套的文件以每个数组的uri
值返回。
[76] => Array
(
[id] => 76
[parentId] => 17
[name] => Evite Templates
[uri] => /Resources/Tools and Forms/General Tools and Forms/Countdown Events/Evite Templates
)
[79] => Array
(
[id] => 79
[parentId] => 90
[name] => Celebration Meeting
[uri] => /Resources/Tools and Forms/General Tools and Forms/Celebration Meeting
)
[80] => Array
(
[id] => 80
[parentId] => 90
[name] => Recruitment Meeting
[uri] => /Resources/Tools and Forms/General Tools and Forms/Recruitment Meeting
)
如何获取文件列表? – RageD 2012-04-17 14:15:04
可能的重复[如何将一系列父子关系转换为分层树?](http://*.com/questions/2915748/how-can-i-convert-a-series-of-parent -child-relationships-into-a-hierarchical-tre) - 请不要粘贴'print_r',而是'var_export'。 – hakre 2012-04-17 14:21:32
@RageD mysql数据库 – danielheinrich 2012-04-17 14:33:51