Created
May 25, 2018 07:34
-
-
Save fhefh2015/92d7d09317e908e39934d7a38c151f0e to your computer and use it in GitHub Desktop.
PHP无限级分类实现
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Created by PhpStorm. | |
* User: qishou | |
* Date: 15-8-2 | |
* Time: 上午12:00 | |
* CopyFrom: https://blog.csdn.net/qishouzhang/article/details/47204359 | |
*/ | |
//准备数组,代替从数据库中检索出的数据(共有三个必须字段id,name,pid) | |
header("content-type:text/html;charset=utf-8"); | |
$categories = array( | |
array('id'=>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)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment