我正在解析一个网站的URL列表,并希望构建一个嵌套数组的层次树。
到目前为止,我得到的(有用的)内容如下。因为我不知道级别会有多深,所以我对深度做了一个简单的检查,然后执行对该节点的基本推送。
我怎样才能重写它,以适应任意数量的级别?
$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();
}
};这些是输入的URL:
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
(
)
)
)
)发布于 2017-02-04 04:50:23
如果将数组作为引用传递,则可以使用递归函数来完成此操作。
$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);为您拥有的每个url调用这个函数,它应该可以工作。
提示:使用reduce。
注意:如果您在web上下文中使用用户输入执行此操作,我将添加一个深度限制,因为如果出现错误的输入,您可能会很容易地耗尽内存。
https://stackoverflow.com/questions/42036263
复制相似问题