PHP数组无限分级数据的层级化处理代码
发布时间:2020-12-13 06:12:51 所属栏目:PHP教程 来源:网络整理
导读:代码如下: /** * 创建父节点树形数组 * 参数 * $ar 数组,邻接列表方式组织的数据 * $id 数组中作为主键的下标或关联键名 * $pid 数组中作为父键的下标或关联键名 * 返回 多维数组 **/ function find_parent($ar,$id='id',$pid='pid') { foreach($ar as $v)
代码如下: /** * 创建父节点树形数组 * 参数 * $ar 数组,邻接列表方式组织的数据 * $id 数组中作为主键的下标或关联键名 * $pid 数组中作为父键的下标或关联键名 * 返回 多维数组 **/ function find_parent($ar,$id='id',$pid='pid') { foreach($ar as $v) $t[$v[$id]] = $v; foreach ($t as $k => $item){ if( $item[$pid] ){ if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) ) $t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]]; $t[$k]['reference'] = true; } } return $t; } /** * 创建子节点树形数组 * 参数 * $ar 数组,邻接列表方式组织的数据 * $id 数组中作为主键的下标或关联键名 * $pid 数组中作为父键的下标或关联键名 * 返回 多维数组 **/ function find_child($ar,$pid='pid') { foreach($ar as $v) $t[$v[$id]] = $v; foreach ($t as $k => $item){ if( $item[$pid] ) { $t[$item[$pid]]['child'][$item[$id]] =& $t[$k]; $t[$k]['reference'] = true; } } return $t; } 示例: 代码如下: $data = array( array('ID'=>1,'PARENT'=>0,'NAME'=>'祖父'), array('ID'=>2,'PARENT'=>1,'NAME'=>'父亲'), array('ID'=>3,'NAME'=>'叔伯'), array('ID'=>4,'PARENT'=>2,'NAME'=>'自己'), array('ID'=>5,'PARENT'=>4,'NAME'=>'儿子') ); $p = find_parent($data,'ID','PARENT'); $c = find_child($data,'PARENT'); 上面两种方法是将所有节点按id平摊到一个数组中,然后找到他们的 parent 或 children,通过引用将 平摊的元素挂接到 parent 、children 下, 但被引用的元素依然存在于平摊的数组中,因此,在实际应用时,最好标记那些被引用的元素,以避免以他们为根开始遍历,导致重复。 代码如下: foreach ($p as $key => $item) { if($item['reference']) continue; print_r($item); } foreach ($c as $key => $item) { if($item['reference']) continue; print_r($item); } 递归法,PHP 数组元素被删除后,数组游标会归零,因此在遍历过程中一些已经找到 “归宿” 的元素也不得不留在数组中,无法缩减后继元素的搜索范围: 代码如下: $mylist = array(array( 'parent_id'=>0,'id'=>1), array( 'parent_id'=>0,'id'=>2),'id'=>3), array( 'parent_id'=>2,'id'=>4),'id'=>5), array( 'parent_id'=>3,'id'=>6),'id'=>7), array( 'parent_id'=>4,'id'=>8), array( 'parent_id'=>5,'id'=>9),'id'=>10) ); function _findChildren($list,$p_id){ //数据层级化, print_r(_findChildren($mylist,0)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |