PHP递归获取分类结构:
/**
* 两个大类:电脑、手机
* --手机{三星Glaxy,IphoneX,华为荣耀}
* --电脑{Dell,Lenovo,IBM}
*/
$data = array(
array('id' => 1, 'name' => '手机', 'pid' => 0),
array('id' => 2, 'name' => '三星Glaxy', 'pid' => 1),
array('id' => 3, 'name' => 'IphoneX', 'pid' => 1),
array('id' => 4, 'name' => '华为荣耀', 'pid' => 1),
array('id' => 5, 'name' => '电脑', 'pid' => 0),
array('id' => 6, 'name' => 'Dell', 'pid' => 5),
array('id' => 7, 'name' => 'Lenovo', 'pid' => 5),
array('id' => 8, 'name' => 'IBM', 'pid' => 5)
);
/**
* 递归获取结构树
* @param array $data 数据源
* @param integer $pid 父类id
* @param integer $level 深度
* @return array 组装好的树
*/
function get_tree($data, $pid = 0, $level = 0) {
static $tree = array();
foreach ($data as $key => $row) {
if ($row['pid'] == $pid) {
$row['level'] = $level;
$tree[] = $row;
unset($data[$key]); //进入树结构后,接下里要查的就只是它的子类了,所以从$data中删除,减少后面查询次数
get_tree($data, $row['id'], $level + 1);
}
}
return $tree;
}
/**
* 输出树结构
* @param array 数据源
* @return void
*/
function echo_tree($tree) {
foreach ($tree as $row) {
for ($i = $row['level']; $i > 0; $i--) {
echo '|----';
}
echo $row['name'];
echo '<br>';
}
}
$tree = get_tree($data, 0, 0);
var_dump($tree);
echo "<hr>";
echo_tree($tree);
echo "<\n>";
执行结果:
array(8) {
[0]=>
array(4) {
["id"]=>
int(1)
["name"]=>
string(6) "手机"
["pid"]=>
int(0)
["level"]=>
int(0)
}
[1]=>
array(4) {
["id"]=>
int(2)
["name"]=>
string(11) "三星Glaxy"
["pid"]=>
int(1)
["level"]=>
int(1)
}
[2]=>
array(4) {
["id"]=>
int(3)
["name"]=>
string(7) "IphoneX"
["pid"]=>
int(1)
["level"]=>
int(1)
}
[3]=>
array(4) {
["id"]=>
int(4)
["name"]=>
string(12) "华为荣耀"
["pid"]=>
int(1)
["level"]=>
int(1)
}
[4]=>
array(4) {
["id"]=>
int(5)
["name"]=>
string(6) "电脑"
["pid"]=>
int(0)
["level"]=>
int(0)
}
[5]=>
array(4) {
["id"]=>
int(6)
["name"]=>
string(4) "Dell"
["pid"]=>
int(5)
["level"]=>
int(1)
}
[6]=>
array(4) {
["id"]=>
int(7)
["name"]=>
string(6) "Lenovo"
["pid"]=>
int(5)
["level"]=>
int(1)
}
[7]=>
array(4) {
["id"]=>
int(8)
["name"]=>
string(3) "IBM"
["pid"]=>
int(5)
["level"]=>
int(1)
}
}
输出树结构:
获取子树:
/**
* 获取子树
* @param $array
* @param int $id
* @return array
*/
function getTree($array, $id=0)
{
$tree = array();
foreach ($array as $key => $value) {
if (in_array($id, explode(',',$value['pid']))) {
$value['children'] = getTree($array, $value['id']);
if (!$value['children']) {
unset($value['children']);
}
$tree[] = $value;
}
}
return $tree;
}
$tree2 = getTree($data, 0);
var_dump($tree2);
执行结果:
array(2) {
[0]=>
array(4) {
["id"]=>
int(1)
["name"]=>
string(6) "手机"
["pid"]=>
int(0)
["children"]=>
array(3) {
[0]=>
array(3) {
["id"]=>
int(2)
["name"]=>
string(11) "三星Glaxy"
["pid"]=>
int(1)
}
[1]=>
array(3) {
["id"]=>
int(3)
["name"]=>
string(7) "IphoneX"
["pid"]=>
int(1)
}
[2]=>
array(3) {
["id"]=>
int(4)
["name"]=>
string(12) "华为荣耀"
["pid"]=>
int(1)
}
}
}
[1]=>
array(4) {
["id"]=>
int(5)
["name"]=>
string(6) "电脑"
["pid"]=>
int(0)
["children"]=>
array(3) {
[0]=>
array(3) {
["id"]=>
int(6)
["name"]=>
string(4) "Dell"
["pid"]=>
int(5)
}
[1]=>
array(3) {
["id"]=>
int(7)
["name"]=>
string(6) "Lenovo"
["pid"]=>
int(5)
}
[2]=>
array(3) {
["id"]=>
int(8)
["name"]=>
string(3) "IBM"
["pid"]=>
int(5)
}
}
}
}
通过递归返回层级数组:
/**
* 根据id通过递归返回层级数组
* @param $lists
* @param $id
* @return array
*/
function getChildren($lists, $id) {
$list = [];
$i = 0;
foreach($lists as $value) {
if(in_array($id, explode(',',$value['pid']))) {
$list[$i] = $value;
$list[$i]['children'] = getChildren($lists, $value['id']);
}
$i++;
}
if($list) {
$list = array_values($list);
return $list;
} else {
return [];
}
}
$tree3 = getChildren($data, 0);
var_dump($tree3);
执行结果:
array(2) {
[0]=>
array(4) {
["id"]=>
int(1)
["name"]=>
string(6) "手机"
["pid"]=>
int(0)
["children"]=>
array(3) {
[0]=>
array(4) {
["id"]=>
int(2)
["name"]=>
string(11) "三星Glaxy"
["pid"]=>
int(1)
["children"]=>
array(0) {
}
}
[1]=>
array(4) {
["id"]=>
int(3)
["name"]=>
string(7) "IphoneX"
["pid"]=>
int(1)
["children"]=>
array(0) {
}
}
[2]=>
array(4) {
["id"]=>
int(4)
["name"]=>
string(12) "华为荣耀"
["pid"]=>
int(1)
["children"]=>
array(0) {
}
}
}
}
[1]=>
array(4) {
["id"]=>
int(5)
["name"]=>
string(6) "电脑"
["pid"]=>
int(0)
["children"]=>
array(3) {
[0]=>
array(4) {
["id"]=>
int(6)
["name"]=>
string(4) "Dell"
["pid"]=>
int(5)
["children"]=>
array(0) {
}
}
[1]=>
array(4) {
["id"]=>
int(7)
["name"]=>
string(6) "Lenovo"
["pid"]=>
int(5)
["children"]=>
array(0) {
}
}
[2]=>
array(4) {
["id"]=>
int(8)
["name"]=>
string(3) "IBM"
["pid"]=>
int(5)
["children"]=>
array(0) {
}
}
}
}
}
参考文章地址: