PHP数组无限分级数据的层级化处理
在很多朋友写无限级分类数据时都直接使用递归来操作,下面我来介绍一下关于PHP无限分级代码优化方法,有需要的朋友可参考参考,代码如下:
<?php /** * 创建父节点树形数组 * 参数 * $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, $id = 'id', $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; } ?>
示例:
<?php $data = array( array( 'ID' => 1, 'PARENT' => 0, 'NAME' => '祖父' ) , array( 'ID' => 2, 'PARENT' => 1, 'NAME' => '父亲' ) , array( 'ID' => 3, 'PARENT' => 1, 'NAME' => '叔伯' ) , array( 'ID' => 4, 'PARENT' => 2, 'NAME' => '自己' ) , array( 'ID' => 5, 'PARENT' => 4, 'NAME' => '儿子' ) ); $p = find_parent($data, 'ID', 'PARENT'); $c = find_child($data, 'ID', 'PARENT'); ?>
上面两种方法是将所有节点按id平摊到一个数组中,然后找到他们的 parent 或 children ,通过引用将 平摊的元素挂接到 parent 、children 下,
但被引用的元素依然存在于平摊的数组中,因此,在实际应用时,最好标记那些被引用的元素,以避免以他们为根开始遍历,导致重复。
<?php 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 数组元素被删除后,数组游标会归零,因此在遍历过程中一些已经找到 "归宿" 的元素也不得不留在数组中,无法缩减后继元素的搜索范围:
<?php $mylist = array( array( 'parent_id' => 0, 'id' => 1 ) , array( 'parent_id' => 0, 'id' => 2 ) , array( 'parent_id' => 0, 'id' => 3 ) , array( 'parent_id' => 2, 'id' => 4 ) , array( 'parent_id' => 2, 'id' => 5 ) , array( 'parent_id' => 3, 'id' => 6 ) , array( 'parent_id' => 3, 'id' => 7 ) , array( 'parent_id' => 4, 'id' => 8 ) , array( 'parent_id' => 5, 'id' => 9 ) , array( 'parent_id' => 5, 'id' => 10 ) ); function _findChildren($list, $p_id) { //数据层级化, $r = array(); foreach ($list as $id => $item) { if ($item['parent_id'] == $p_id) { $length = count($r); $r[$length] = $item; if ($t = $this->_findChildren($list, $item['id'])) { $r[$length]['children'] = $t; } } } return $r; } print_r(_findChildren($mylist, 0)); ?>
本文地址:http://www.phprm.com/develop/fs4039.html
转载随意,但请附上文章地址:-)