Php 递归地构建可变深度的多维数组
我正在解析一个网站的URL列表,并希望构建一个嵌套数组的层次结构树 到目前为止,我所做的工作如下。因为我不知道这些层会有多深,所以我对深度做了一个简单的检查,然后对那个节点执行一个基本的推送 我如何重写它以适应任意数量的级别Php 递归地构建可变深度的多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我正在解析一个网站的URL列表,并希望构建一个嵌套数组的层次结构树 到目前为止,我所做的工作如下。因为我不知道这些层会有多深,所以我对深度做了一个简单的检查,然后对那个节点执行一个基本的推送 我如何重写它以适应任意数量的级别 $tree = array(); $tree[$domain] = array(); // this is the domain root foreach ( $allMatches as $url ) { $foo = parse_url($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
(
)
)
)
)
如果将数组作为引用传递,可以使用递归函数来实现这一点
$result=array();
函数构建数组(&$arr,$parts,$i=0){
如果($i==sizeof($parts))
返回;
如果(!isset($arr[$parts[$i]]))
$arr[$parts[$i]]=array();
构建数组($arr[$parts[$i]],$parts$i+1);
}
#这样说吧:
构建数组($result$parts);
为您拥有的每个url调用此函数,它应该可以工作
提示:使用
注意:如果您在有用户输入的web环境中执行此操作,我会添加一个深度限制,因为如果输入错误,此实现很容易耗尽内存。能否提供输入和所需输出的示例?如果列表中没有
page-2
,但是您确实有page-2/page-2-1
要创建父节点(即page-2
),还是只希望page-1-2
作为叶节点?在这种情况下,我希望创建父节点和叶。非常好。1个小修改:$result[$domain]=array()代码>它就像一个符咒。