<?php
date_default_timezone_set('Asia/Shanghai');
//示例数组
$arr = array(
array('id' => 1, 'pid' => 0, 'name' => '河北省'),
array('id' => 2, 'pid' => 0, 'name' => '北京市'),
array('id' => 5, 'pid' => 2, 'name' => '通州区'),
array('id' => 4, 'pid' => 2, 'name' => '朝阳区'),
array('id' => 3, 'pid' => 1, 'name' => '邯郸市'),
array('id' => 6, 'pid' => 4, 'name' => '望京'),
array('id' => 7, 'pid' => 4, 'name' => '酒仙桥'),
array('id' => 8, 'pid' => 3, 'name' => '永年区'),
array('id' => 9, 'pid' => 1, 'name' => '武安市'),
);
/**
* Notes: 无限极分类--递归 这个只能得到排序好的一维数组
* @param $array
* @param int $pid 需要的顶级分类
* @param int $deep 分类等级
* @return array
*/
function getTree($array, $pid=0, $deep = 0){
static $list = array();//声明静态数组,避免递归调用时,多次声明导致数组覆盖
foreach ($array as $key => $value){
if ($value['pid'] == $pid){
$value['deep'] = $deep;
$list[] = $value;
unset($array[$key]);
getTree($array, $value['id'], $deep+1);
}
}
return $list;
}
/**
* Notes: 无限极分类--递归 这个可以得到树形结构的多维数组,但是无法找出没有父级的数据(顶级分类除外)
* @param array $array
* @param int $pid
* @param int $deep 分类等级
* @return array
*/
function getTree2($array = array(), $pid = 0, $deep = 0){
$list = array();
foreach ($array as $key => $item) {
if ($item['pid'] == $pid) {
$item['child'] = getTree2($array, $item['id'], $deep+1);
$list[$key] = $item;
}
}
return $list;
}
/**
* Notes: 无限极分类 --引用 这个可以得到一个树形结构的多维数组 执行效率要高于递归方式
* @param array $array
* @return array
*/
function getTree3($array = array()) {
$data = array();
foreach ($array as $item) {
$data[$item['id']] = $item;
}
$tree = array();
foreach ($data as $k => $v) {
if (isset($data[$v['pid']])) {
$data[$v['pid']]['child'][] = &$data[$k];
} else {
$tree[$k] = &$data[$k];
}
}
return $tree;
}
$res = getTree2($arr);
echo "<pre>";
print_r($res);
?>