PHP 保存树形结构并解析
比如一个父节点分裂两个子节点或n个子节点,子节点再进行分裂。 这是在解决迷宫的过程中,偶然获得的,用于计算每一个点的所有可能路径。
代码:
//树形结构 [1,0]是父节点 [1,1] 是父节点[1,0]的子节点 , [1,2] ,[2,1]是父节点[1,1]的子节点 ...
$step = json_decode('{"0":[1,0],"10":[[1,1]],"11":[[1,2],[2,1]],"12":[[2,2],[0,2]],"22":[[3,2],[3,2]],"02":[[0,3]],"21":[[2,2],[3,1]],"31":[[3,2],[3,0]]}', true);
echo json_encode(getEveryLink($step));
function getEveryLink($step){
$arr=[];
$item=$step[0];
unset($step[0]);
$parent=[];
$result=[];
return linkTable($result,$step,$item,$item,$arr,$parent);
}
function linkTable($result, $step, $item, $start, $ar, $parent)
{
if (isset($step[$item[0] . $item[1]]) && !empty($step[$item[0] . $item[1]])) {
$items = $step[$item[0] . $item[1]];
$length = count($items);
for ($i = 0; $i < $length; $i++) {
if (!in_array($items[$i], $ar)) {//避免形成一个环
$parent[] = $items[$i];
$ar[] = $items[$i];
$item = $items[$i];
$result = linkTable($result, $step, $item, $start, $ar, $parent);
array_pop($parent);
$ar = $parent;
}
}
return array_values(array_unique($result, SORT_REGULAR));
} else {
array_unshift($ar, $start);
$result[] = $ar;
return $result;
}
}
输出:
[[[1,0],[1,1],[1,2],[2,2],[3,2]],[[1,0],[1,1],[1,2],[0,2],[0,3]],[[1,0],[1,1],[2,1],[2,2],[3,2]],[[1,0],[1,1],[2,1],[3,1],[3,2]],[[1,0],[1,1],[2,1],[3,1],[3,0]]]