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

时间:2017-02-04 03:51:00

标签: php arrays multidimensional-array

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

我到目前为止(其中有效)的内容如下。因为我不知道关卡的深度,我会对深度进行简单的检查,然后对该节点执行基本的推送。

如何重写这个以便适应任何数量的等级?

$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
                        (
                        )
        )
    )
)

1 个答案:

答案 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>

相关问题