首页 > php开发 > PHP数组无限分级数据的层级化处理

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

转载随意,但请附上文章地址:-)

标签:php数组 无限分级 数据层级化

相关文章

发表留言