发布于 5年前

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]]]
©2020 edoou.com   京ICP备16001874号-3