我正在解析网站的网址列表,并希望构建一个嵌套数组的分层树。
我到目前为止(其中有效)的内容如下。因为我不知道关卡的深度,我会对深度进行简单的检查,然后对该节点执行基本的推送。
如何重写这个以便适应任何数量的等级?
$tree = array();
$tree[$domain] = array(); // this is the domain root
foreach ( $allMatches as $url ) {
$foo = parse_url($url );
// trim "/" from beginning and end
$bar = trim($foo['path'],'/');
// for every "/", add a level
$parts = explode('/', $bar);
$parts = array_filter($parts, 'strlen');
// note: there is likely a bug in here.
// If I process page-1/page-1-1 before page-1,
// then the leaf or branch containing page-1-1 will be deleted
if (count($parts) == 1){
$tree[$domain][$parts[0]] = array();
}
if (count($parts) == 2){
$tree[$domain][$parts[0]][$parts[1]] = array();
}
if (count($parts) == 3){
$tree[$domain][$parts[0]][$parts[1]][$parts[2]] = array();
}
if (count($parts) == 4){
$tree[$domain][$parts[0]][$parts[1]][$parts[2]][$parts[3]] = array();
}
};
这些是输入网址:
domain.com/page-1
domain.com/page-1/page-1-1
domain.com/page-1/page-1-1/page-1-1-1
domain.com/page-1/page-1-2
domain.com/page-1/page-1-1/page-1-2-1
domain.com/page-2
domain.com/page-2/page-2-1
注意:我不一定需要在列表中添加domain.com/page-2
才能生成domain.com/page-2/page-2-1
这是期望的结果:
Array
(
[domain.com] => Array
(
[page-1] => Array
(
[page-1-1] => Array
(
[page-1-1-1] => Array
(
)
)
[page-1-2] => Array
(
[page-1-2-1] => Array
(
)
)
)
[page-2] => Array
(
[page-2-1] => Array
(
)
)
)
)
答案 0 :(得分:1)
如果将数组作为引用传递,则可以使用递归函数执行此操作。
$result = array();
function build_array(&$arr, $parts, $i = 0){
if($i == sizeof($parts))
return;
if(!isset($arr[$parts[$i]]))
$arr[$parts[$i]] = array();
build_array($arr[$parts[$i]], $parts, $i+1);
}
# Call it like so:
build_array($result, $parts);
为您拥有的每个网址调用此功能,它应该可以使用。
提示:使用array_reduce。
注意:如果您在具有用户输入的Web上下文中执行此操作,我会添加一个深度限制,因为如果输入错误,您可能很容易因此实现内存不足。< / p>