Heim  >  Artikel  >  Backend-Entwicklung  >  PHP无限级分类实现(递归+非递归)

PHP无限级分类实现(递归+非递归)

WBOY
WBOYOriginal
2016-08-08 09:19:26832Durchsuche
<?php /**
 * Created by PhpStorm.
 * User: qishou
 * Date: 15-8-2
 * Time: 上午12:00
 */
//准备数组,代替从数据库中检索出的数据(共有三个必须字段id,name,pid)
header("content-type:text/html;charset=utf-8");
$categories = array(
    array(&#39;id&#39;=>1,'name'=>'电脑','pid'=>0),
    array('id'=>2,'name'=>'手机','pid'=>0),
    array('id'=>3,'name'=>'笔记本','pid'=>1),
    array('id'=>4,'name'=>'台式机','pid'=>1),
    array('id'=>5,'name'=>'智能机','pid'=>2),
    array('id'=>6,'name'=>'功能机','pid'=>2),
    array('id'=>7,'name'=>'超级本','pid'=>3),
    array('id'=>8,'name'=>'游戏本','pid'=>3),
);

/*======================非递归实现========================*/
$tree = array();
//第一步,将分类id作为数组key,并创建children单元
foreach($categories as $category){
    $tree[$category['id']] = $category;
    $tree[$category['id']]['children'] = array();
}
//第二步,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach($tree as $key=>$item){
    if($item['pid'] != 0){
        $tree[$item['pid']]['children'][] = &$tree[$key];//注意:此处必须传引用否则结果不对
        if($tree[$key]['children'] == null){
            unset($tree[$key]['children']); //如果children为空,则删除该children元素(可选)
        }
    }
}
////第三步,删除无用的非根节点数据
foreach($tree as $key=>$category){
    if($category['pid'] != 0){
        unset($tree[$key]);
    }
}

print_r($tree);

/*======================递归实现========================*/
$tree = $categories;
function get_attr($a,$pid){
    $tree = array();                                //每次都声明一个新数组用来放子元素
    foreach($a as $v){
        if($v['pid'] == $pid){                      //匹配子记录
            $v['children'] = get_attr($a,$v['id']); //递归获取子记录
            if($v['children'] == null){
                unset($v['children']);             //如果子元素为空则unset()进行删除,说明已经到该分支的最后一个元素了(可选)
            }
            $tree[] = $v;                           //将记录存入新数组
        }
    }
    return $tree;                                  //返回新数组
}
echo "<br><br><br>";

print_r(get_attr($tree,0));

版权声明:本文为博主原创文章,未经博主允许不得转载。

以上就介绍了PHP无限级分类实现(递归+非递归),包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn