首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归构建一个多维变深度数组

递归构建一个多维变深度数组
EN

Stack Overflow用户
提问于 2017-02-04 03:51:00
回答 1查看 83关注 0票数 1

我正在解析一个网站的URL列表,并希望构建一个嵌套数组的层次树。

到目前为止,我得到的(有用的)内容如下。因为我不知道级别会有多深,所以我对深度做了一个简单的检查,然后执行对该节点的基本推送。

我怎样才能重写它,以适应任意数量的级别?

代码语言:javascript
复制
$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:

代码语言:javascript
复制
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生成一个叶

这是所需的结果结构:

代码语言:javascript
复制
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
                        (
                        )
        )
    )
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-04 04:50:23

如果将数组作为引用传递,则可以使用递归函数来完成此操作。

代码语言:javascript
复制
$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上下文中使用用户输入执行此操作,我将添加一个深度限制,因为如果出现错误的输入,您可能会很容易地耗尽内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42036263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档