实际项目开发,经常碰到无限级分类、三级省市区联动。
有数据如下:
$areas = [
['id' => 110000, 'name' => '北京市', 'pid' => 0],
['id' => 310000, 'name' => '上海市', 'pid' => 0],
['id' => 440000, 'name' => '广东省', 'pid' => 0],
['id' => 110100, 'name' => '北京市区', 'pid' => 110000],
['id' => 110101, 'name' => '东城区', 'pid' => 110100],
['id' => 110105, 'name' => '朝阳区', 'pid' => 110100],
['id' => 310100, 'name' => '上海市', 'pid' => 310000],
['id' => 310101, 'name' => '黄浦区', 'pid' => 310000],
['id' => 310115, 'name' => '浦东新区', 'pid' => 310000],
['id' => 440100, 'name' => '广州市', 'pid' => 440000],
['id' => 440600, 'name' => '佛山市', 'pid' => 440000],
['id' => 440104, 'name' => '越秀区', 'pid' => 440100],
['id' => 440106, 'name' => '天河区', 'pid' => 440100],
['id' => 440606, 'name' => '顺德区', 'pid' => 440600],
['id' => 440605, 'name' => '南海区', 'pid' => 440600],
];
递归实现方式:
function getTree($items,$pid){
$tree = array();
foreach ($items as $value) {
if ($value['pid'] == $pid) {
$value['child'] = getTree($items, $value['id']);
if (!$value['child']) {
unset($value['child']); //如果child为空,则删除该children元素(可选)
}
$tree[] = $value;
}
}
return $tree;
}
print_r(getTree($areas,0));
非递归(数组引用)实现
function getTree($items){
// 索引数组转成键值对的形式
$arr = [];
foreach ($items as $val) {
$arr[$val['id']] = $val;
}
$tree = array();
foreach ($arr as $item) {
if (isset($arr[$item['pid']])) {
$arr[$item['pid']]['child'][] = &$arr[$item['id']];
} else {
$tree[] = &$arr[$item['id']];
}
}
return $tree;
}
print_r(getTree($areas));
Array
(
[0] => Array
(
[id] => 110000
[name] => 北京市
[pid] => 0
[child] => Array
(
[0] => Array
(
[id] => 110100
[name] => 北京市区
[pid] => 110000
[child] => Array
(
[0] => Array
(
[id] => 110101
[name] => 东城区
[pid] => 110100
)
[1] => Array
(
[id] => 110105
[name] => 朝阳区
[pid] => 110100
)
)
)
)
)
[1] => Array
(
[id] => 310000
[name] => 上海市
[pid] => 0
[child] => Array
(
[0] => Array
(
[id] => 310100
[name] => 上海市
[pid] => 310000
)
[1] => Array
(
[id] => 310101
[name] => 黄浦区
[pid] => 310000
)
[2] => Array
(
[id] => 310115
[name] => 浦东新区
[pid] => 310000
)
)
)
[2] => Array
(
[id] => 440000
[name] => 广东省
[pid] => 0
[child] => Array
(
[0] => Array
(
[id] => 440100
[name] => 广州市
[pid] => 440000
[child] => Array
(
[0] => Array
(
[id] => 440104
[name] => 越秀区
[pid] => 440100
)
[1] => Array
(
[id] => 440106
[name] => 天河区
[pid] => 440100
)
)
)
[1] => Array
(
[id] => 440600
[name] => 佛山市
[pid] => 440000
[child] => Array
(
[0] => Array
(
[id] => 440606
[name] => 顺德区
[pid] => 440600
)
[1] => Array
(
[id] => 440605
[name] => 南海区
[pid] => 440600
)
)
)
)
)
)