今天刚好要用到,写完了就记录下,网上的代码都是不靠谱的,还是自己写的好用。

递归的数组,自己转回数组

  1. [{"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代码

  1. /**
  2. * 下拉框递归生成
  3. * @todo 无
  4. * @author 小黄牛
  5. * @version v1.2.16 + 2020.10.27
  6. * @deprecated 暂不启用
  7. * @global 无
  8. * @param array $list 需要递归的下拉数组
  9. * @param int $level 递归深度
  10. * @param string $html 生成的下拉菜单
  11. * @param string $end_tis 上级父类的树节点符号
  12. * @return string
  13. */
  14. function select_menu($list, $level=0, $html='', $end_tis='') {
  15. foreach ($list as $k=>$v) {
  16. if ($v['pid'] == 0) {
  17. $tis = '';
  18. $level=0;
  19. } else {
  20. // 还有同级元素
  21. if (isset($list[$k+1])) {
  22. $tis = '├';
  23. } else {
  24. // 最后一个同级元素
  25. $tis = '└';
  26. }
  27. }
  28. $span = '';
  29. for ($i=0; $i<$level; $i++) {
  30. if ($i > 0) {
  31. // 判断是否有下级元素
  32. if ($i==($level-1) && isset($v['nodes'])) {
  33. // 只有下级还有下级,最后一个竖线才显示
  34. if (isset($v['nodes'][0]['nodes']) || $tis == '├') {
  35. $span .= '│';
  36. } else {
  37. if ($tis == '└' && $end_tis == '├') {
  38. $span .= '│';
  39. }
  40. }
  41. } else {
  42. $span .= '│';
  43. }
  44. }
  45. $span .= '&nbsp;&nbsp;';
  46. }
  47. $html .= '<option value="'.$v['id'].'">'.$span.$tis.$v['text'].'</option>';
  48. if (isset($v['nodes'])) {
  49. $html = $this->select_menu($v['nodes'], $level+1, $html, $tis);
  50. }
  51. }
  52. return $html;
  53. }
  54. echo select_menu($list)