在php

时间:2019-06-21 17:55:59

标签: php arrays recursion

问题可以看作是树的构造:

我有一个初始数组,比方说树数组:

$tree = array(
             11 => array(
                         5 => array()
                   )
        );

因此,我们知道树必须沿着路径生长:

$path = array(11,5);

现在,我必须在树上添加一些分支:

$branches = array(
                 5 => array(
                           2 => array(),
                           3 => array(),
                           4 => array(),
                           26 => array()
                 ),
                 4 => array(
                           30 => array(),
                           10 => array()
                 ),
                 26 => array(
                           1 => array(),
                           2 => array(),
                           3 => array()
                 ),
                 30 => array(
                           1 => array(),
                           2 => array(),
                           4 => array()
                 ),
                 1 => array(
                           3 => array(),
                           4 => array(),
                           26 => array(),
                           30 => array()
                 )
            );

当分支的索引等于树中最深数组之一的索引时,分支与树连接。这意味着如果树是三维数组,则新分支将添加到属于该树的三维数组之一。

当我们在树上添加一个分支时,该分支会消失到最深的层次,因此,如果我们在最深的位置看到相同的圆锥形,则无需再次添加该分支。但是重要的是要考虑到,如果一个分支可以连接到同一级别(数组深度)的树的多个位置,那么它将连接所有这些分支。

最后一棵树应该是这样的

  • 11
    • 5
      • 2
      • 3
      • 4
        • 30
          • 1
          • 2
          • 4
        • 10
      • 26
        • 1
          • 3
          • 4
          • 26
          • 30
        • 2
        • 3

我尝试过许多不同的方法来解决它,但是每种方法都会在某个时候失败。

例如,每当我发现一个连接时,就循环遍历分支,将分支删除并将其添加到树中。

在递归函数中,想法是遍历树并在每次移动中获取键($ real_time_path)。将real_time_path与整个路径进行比较,如果两者相等,则意味着我们以正确的方式放置数据。让我们将密钥添加到路径(1),然后退出(对于下一个分支)。如果不是,请再次调用该功能(2)

$u = 0;
while(count($branches)){
    foreach ($branches as $k => $v){
        $response = addBranch($tree,array($k => $v),$path);
        if($response == 1){
            unset($branches[$k]);
        }
    }
    //just to prevent an infinite loop
    $u++;if($u>100){echo "let's better stop here";break;}
}

function addBranch(&$tree, $data, &$path, $real_time_path = array()){

    foreach($tree as $k => &$branch){
        $real_time_path[] = $k;
        if($real_time_path === $path){
            //If I include the next line, it takes other branch;
            //$path[] = $k;
            $branch = $data;
            return 1;
        }
        else{
            if(!count($branch)){
                unset($real_time_path[count($real_time_path)-1]);
            }
            addBranch($branch,$data,$path,$real_time_path);
        }
    }
}

(1):这里有些问题,但是我无法正确获得两个分支(5和4)。

(2):这里也有问题,因为如果所评估的路径不匹配(例如[11,5,2]),则无论如何它将被添加到real_time_path中,这是错误的。

我试图用线条来解决它:

if(!count($branch)){
    unset($real_time_path[count($real_time_path)-1]);
}

因为我知道我们是否在分支的末尾,所以这不是正确的方法,所以我必须删除最后添加的元素。

我已经完全解决了这个问题,所以请以某种方式寻求帮助。

非常感谢。

0 个答案:

没有答案