Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 递归地构建可变深度的多维数组_Php_Arrays_Multidimensional Array - Fatal编程技术网

Php 递归地构建可变深度的多维数组

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 );

我正在解析一个网站的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()它就像一个符咒。