极简PHP无限极分类生成树方法

  • Jesse
  • 2015-12-12 13:13:00
  • 2805

你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了。该方法,巧在 地址引用

$items = array(
    1 => array('id' => 1, 'pid' => 0, 'name' => '安徽省'),
    2 => array('id' => 2, 'pid' => 0, 'name' => '浙江省'),
    3 => array('id' => 3, 'pid' => 1, 'name' => '合肥市'),
    4 => array('id' => 4, 'pid' => 3, 'name' => '长丰县'),
    5 => array('id' => 5, 'pid' => 1, 'name' => '安庆市'),
);

function generateTree1($items){
    $tree = array();
    foreach($items as $item){
        if(isset($items[$item['pid']])){
            $items[$item['pid']]['son'][] = &$items[$item['id']];
        }else{
            $tree[] = &$items[$item['id']];
        }
    }
    return $tree;
}

/* 上面生成树方法还可以精简到5行,
 * 唯一不同的是,上面方法数组下标是从0开始,下面这个从1开始
*/
function generateTree2($items){
    foreach($items as $item)
        $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
    return isset($items[0]['son']) ? $items[0]['son'] : array();
}

//去除所有数据还是得用递归
function getTreeData($tree){
    foreach($tree as $t){
        echo $t['name'].'<br>';
        if(isset($t['son'])){
            getTreeData($t['son']);
        }
    }
}

$tree = generateTree2($items);
print_r($tree);
getTreeData($tree);

输出结果:

Array
(
    [1] => Array
        (
            [id] => 1
            [pid] => 0
            [name] => 安徽省
            [son] => Array
                (
                    [3] => Array
                        (
                            [id] => 3
                            [pid] => 1
                            [name] => 合肥市
                            [son] => Array
                                (
                                    [4] => Array
                                        (
                                            [id] => 4
                                            [pid] => 3
                                            [name] => 长丰县
                                        )

                                )

                        )

                    [5] => Array
                        (
                            [id] => 5
                            [pid] => 1
                            [name] => 安庆市
                        )

                )

        )

    [2] => Array
        (
            [id] => 2
            [pid] => 0
            [name] => 浙江省
        )

)
安徽省
合肥市
长丰县
安庆市
浙江省