今天刚好要用到,写完了就记录下,网上的代码都是不靠谱的,还是自己写的好用。
递归的数组,自己转回数组
[{"id":1,"pid":0,"text":"超级管理员","nodes":[{"id":3,"pid":1,"text":"业务员","nodes":[{"id":8,"pid":3,"text":"区部一","nodes":[{"id":10,"pid":8,"text":"a银河","nodes":[]},{"id":11,"pid":8,"text":"b暴富","nodes":[]},{"id":12,"pid":8,"text":"c流星","nodes":[]}]},{"id":9,"pid":3,"text":"区部二","nodes":[{"id":13,"pid":9,"text":"a战狼","nodes":[]}]}]},{"id":6,"pid":1,"text":"后勤","nodes":[{"id":7,"pid":6,"text":"财务","nodes":[]}]}]}]
PHP代码
/**
* 下拉框递归生成
* @todo 无
* @author 小黄牛
* @version v1.2.16 + 2020.10.27
* @deprecated 暂不启用
* @global 无
* @param array $list 需要递归的下拉数组
* @param int $level 递归深度
* @param string $html 生成的下拉菜单
* @param string $end_tis 上级父类的树节点符号
* @return string
*/
function select_menu($list, $level=0, $html='', $end_tis='') {
foreach ($list as $k=>$v) {
if ($v['pid'] == 0) {
$tis = '';
$level=0;
} else {
// 还有同级元素
if (isset($list[$k+1])) {
$tis = '├';
} else {
// 最后一个同级元素
$tis = '└';
}
}
$span = '';
for ($i=0; $i<$level; $i++) {
if ($i > 0) {
// 判断是否有下级元素
if ($i==($level-1) && isset($v['nodes'])) {
// 只有下级还有下级,最后一个竖线才显示
if (isset($v['nodes'][0]['nodes']) || $tis == '├') {
$span .= '│';
} else {
if ($tis == '└' && $end_tis == '├') {
$span .= '│';
}
}
} else {
$span .= '│';
}
}
$span .= ' ';
}
$html .= '<option value="'.$v['id'].'">'.$span.$tis.$v['text'].'</option>';
if (isset($v['nodes'])) {
$html = $this->select_menu($v['nodes'], $level+1, $html, $tis);
}
}
return $html;
}
echo select_menu($list)