无限极结构循环,不适用任何数组函数,一次循环,并根据给出的root 快速筛选

<?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);

原文地址:http://blog.51cto.com/nightwizard/2103540

时间: 2024-11-08 19:33:22

无限极结构循环,不适用任何数组函数,一次循环,并根据给出的root 快速筛选的相关文章

Android无限极树状(tree)结构Demo

上篇文章写了一下ExpandableListView,就是两层结构的点击,Android中没有三层结构的组件,这个时候需要自己去扩展一下,可以扩展ExpandableListView,也可以选择扩展ListView.为了是实现这个效果,也是在搜了很多文章(中国的文章你懂的),有个哥们在GitHub开源了项目,奈何封装的太多,看的头晕目眩.看到有人扩展ListView的更符合自己的想法,因为做服务器端的时候也是先加载顶层元素,然后控制点击事件加载父级下面的子元素,有这个理解就可以去是实现一颗所谓的

无限极分类不用递归生成多维数组(树)的方法

最近在项目中碰到的一个实际问题:后台商品分类用的是无限极方法(如图1所示), (图1) 现在前台要根据分类遍历出三级导航(效果如图2所示), (图2) 需要把查询出来的数据处理成多维数组,方便前台用多个foreach嵌套遍历. 网上多方搜集资料.经过验证成功后,记录解决方案如下: 1.从数据库查询出所有数据(项目用的ThinkPHP框架): 2.对数据进行初步处理,使二维数组的"键"与三维数组的id相等,将数据存入新数组$tmp: 1 $info = D('classify')->

问答项目---递归重新排序无限极子分类数组

递归重新排序无限极子分类数组方法: // 递归重新排序无限极子分类数组 function recursive($array,$pid=0,$level=0){ $arr = array(); foreach ($array as $v) { if($v['pid'] == $pid){ $v['level'] = $level; $v['html'] = str_repeat('--',$level); $arr[] = $v; $arr = array_merge($arr,recursive

无限极分类/数组处理

------------无限极分类--------------------    function _tree($arr,$pid=0,$val=0){        static $list=array();        foreach($arr as $v){            if($v["pid"]==$pid){                $v["val"]=$val;                $list[]=$v;            

创建无限极分类树型结构

先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类信息(id:该分类的ID值,cate_name:该分类的名称,pid:父ID,sorts:为显示标题顺序排序做准备,可不写.) 1 public function cate_display() 2 { 3 $cate = D('Cate'); 4 $field = array('id','cate_

循环结构与C#中的数组(5)

一.循环结构 1.while  A.语法   while(条件表达式)   { ...循环体(循环操作) //编写代码,将条件表达式从true改为false    结束循环  }  注意:       条件表达式,必须为布尔类型(true\false) B.特征:先判断,再循环,有可能1次循环都没有 2.do...while  A.语法   do{ ...循环体(循环操作) //编写代码,将条件表达式从true改为false 结束循环  }while(条件表达式);    注意:       

递归方法:对于树形结构的表,根据当前数据获取无限极的父级名称

递归返回格式如:一级>二级>三级 private string GetPerUserGroup( string groupid, string usergroupname) { string str = usergroupname; if (Convert.ToInt32(groupid) > 0) { Community.Model.USER_GROUP gt = BUSER_GROUPExtBLL.SelectByID(int.Parse(groupid)); if (gt != n

PHP无限极分类的实现(不使用递归)

无限极分类在开发中经常使用,例如:部门结构.文章分类.无限极分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在<无限级分类实现思路>一文中介绍了几种常见的实现方法,各有利弊.其中“改进前序遍历树”数据结构,便于输出和查询,但是在移动分类和常规理解上有些复杂. 2.数据结构 id fid title 1 0 中国 2 1 江苏 3 1 安徽 4 8 江阴 5 3 芜湖 6 3 合肥 7 3 蚌埠 8 2 无

递归的一些应用(二)无限极分类

用递归的方法实现无限极分类 通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ----------------------------