博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无限极结构循环,不适用任何数组函数,一次循环,并根据给出的root 快速筛选...
阅读量:6998 次
发布时间:2019-06-27

本文共 3449 字,大约阅读时间需要 11 分钟。

<?php

$nodesArrays = [
['id' => 1, 'pid' => 0, 'name' => 'a'],
['id' => 2, 'pid' => 0, 'name' => 'b'],
['id' => 3, 'pid' => 1, 'name' => 'c'],
['id' => 4, 'pid' => 2, 'name' => 'd'],
['id' => 5, 'pid' => 6, 'name' => 'e'],
['id' => 6, 'pid' => 4, 'name' => 'f'],
['id' => 7, 'pid' => 6, 'name' => 'g'],
['id' => 8, 'pid' => 6, 'name' => 'h'],
['id' => 9, 'pid' => 10, 'name' => 'i'],
['id' => 10, 'pid' => 8, 'name' => 'j'],
['id' => 12, 'pid' => 6, 'name' => 'l'],
['id' => 15, 'pid' => 7, 'name' => 'm'],
];

$nodesArray1 = [

['id' => 1, 'pid' => 4, 'name' => 'a'],
['id' => 2, 'pid' => 0, 'name' => 'b'],
['id' => 3, 'pid' => 1, 'name' => 'c'],
['id' => 4, 'pid' => 2, 'name' => 'd'],
['id' => 5, 'pid' => 6, 'name' => 'e'],
['id' => 6, 'pid' => 4, 'name' => 'f'],
['id' => 7, 'pid' => 6, 'name' => 'g'],
['id' => 8, 'pid' => 6, 'name' => 'h'],
['id' => 9, 'pid' => 10, 'name' => 'i'],
['id' => 10, 'pid' => 8, 'name' => 'j'],
['id' => 12, 'pid' => 6, 'name' => 'l'],
['id' => 15, 'pid' => 7, 'name' => 'm'],
];

//换个思路 ,不改变源数据,新创建一个根节点,一个子节点树

function getTreeNode3($list, $root = 0, $pk='id', $pid = 'pid', $child = '_child') {
// 创建根节点
$root_tree = array();
// 创建子节点
$node_tree = array();
// 迷路节点
$no_tree = array();
if(is_array($list)) {
//既然不能使用数组函数改变源数据的下标,那么就把子节点的下标放在子节点tree即可
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data[$pid];
$nowId = $data[$pk];
//根据$root 值 确定根节点数组,非 0 root 有问题
if ($root == $parentId && $root == 0) {
$node_tree[$nowId] = $data;
$root_tree[$nowId] = &$node_tree[$nowId];
}else if ($root == $nowId && $root != 0) {
$node_tree[$nowId] = $data;
$root_tree[$nowId] = &$node_tree[$nowId];
if(isset($no_tree[$nowId])) {
$node_tree[$nowId][$child] = &$no_tree[$nowId];
}
}else {

//同时确认 根节点 与 子节点是否都存在            //先找子节点            //$flag_node_tree = false;            //同时存在根节点,则映射父节点 与 子节点关联            if (isset($root_tree[$parentId]) && isset($node_tree[$parentId])) {                //同时存在 映射父子关系,改变子                $root_tree[$parentId] = &$node_tree[$parentId];                $node_tree[$nowId] = $data;                $node_tree[$parentId][$child][$nowId] = &$node_tree[$nowId];                if(isset($no_tree[$nowId])) {                    $node_tree[$nowId][$child] = &$no_tree[$nowId];                }            }else if (!isset($root_tree[$parentId]) && isset($node_tree[$parentId])) {                //父不存在子存在则写入子的子                $node_tree[$nowId] = $data;                $node_tree[$parentId][$child][$nowId] = &$node_tree[$nowId];                if(isset($no_tree[$nowId])) {                    $node_tree[$nowId][$child] = &$no_tree[$nowId];                }            }else if (isset($root_tree[$parentId]) && !isset($node_tree[$parentId])) {                //父节点存在,而子节点没有                $node_tree[$nowId] = $data;                $root_tree[$parentId][$child][$nowId] = &$node_tree[$nowId];                if(isset($no_tree[$nowId])) {                    $root_tree[$parentId][$child] = &$no_tree[$nowId];                }            }else {                $node_tree[$nowId] = $data;                $no_tree[$parentId][$nowId] = &$node_tree[$nowId];            }        }        /*echo "\nroot_tree\n";        print_r($root_tree);        echo "\nnode_tree\n";        print_r($node_tree);        echo "\nno_tree\n";        print_r($no_tree);*/    }}return $root_tree;

}

$treeval = getTreeNode3($nodesArrays,8);

print_r($treeval);

转载于:https://blog.51cto.com/nightwizard/2103540

你可能感兴趣的文章