问题可以看作是树的构造:
我有一个初始数组,比方说树数组:
$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()
)
);
当分支的索引等于树中最深数组之一的索引时,分支与树连接。这意味着如果树是三维数组,则新分支将添加到属于该树的三维数组之一。
当我们在树上添加一个分支时,该分支会消失到最深的层次,因此,如果我们在最深的位置看到相同的圆锥形,则无需再次添加该分支。但是重要的是要考虑到,如果一个分支可以连接到同一级别(数组深度)的树的多个位置,那么它将连接所有这些分支。
最后一棵树应该是这样的
我尝试过许多不同的方法来解决它,但是每种方法都会在某个时候失败。
例如,每当我发现一个连接时,就循环遍历分支,将分支删除并将其添加到树中。
在递归函数中,想法是遍历树并在每次移动中获取键($ 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]);
}
因为我知道我们是否在分支的末尾,所以这不是正确的方法,所以我必须删除最后添加的元素。
我已经完全解决了这个问题,所以请以某种方式寻求帮助。
非常感谢。