如何在PHP(Laravel Blade)中将基础数组树形打印输出
优雅实现Laravel Blade中员工职位层级的树形渲染
折腾嵌套if/else确实头疼!我们可以拆成两步解决:先把扁平数组转成树形结构,再用Blade的递归能力渲染,彻底摆脱冗余的判断逻辑。
第一步:把扁平数组转换成树形结构数组
首先得把你手里的扁平员工数据,按上下级关系组织成带层级的树形数组。可以在控制器或者专门的工具类里写个方法处理:
// 假设你的原始扁平数组是 $flatEmployees function buildPositionTree(array $flatEmployees): array { // 先把所有员工按ID索引,方便快速查找上级 $indexedEmployees = collect($flatEmployees)->keyBy('id')->toArray(); $tree = []; foreach ($indexedEmployees as $employee) { // 如果当前员工有上级且上级存在 if (isset($employee['chief_id']) && isset($indexedEmployees[$employee['chief_id']])) { // 把当前员工加入上级的子节点列表 $indexedEmployees[$employee['chief_id']]['children'][] = &$indexedEmployees[$employee['id']]; } else { // 没有上级的就是顶级节点(比如职位层级1的员工) $tree[] = &$indexedEmployees[$employee['id']]; } } return $tree; } // 在控制器里调用,把树形数组传给视图 $positionTree = buildPositionTree($yourFlatEmployeesArray); return view('positions.tree', compact('positionTree'));
这里用了引用(&)来避免重复复制数组,效率更高。如果你的层级是完全靠position_level严格递进的,也可以调整逻辑按层级分组,但用chief_id关联更准确,毕竟实际场景里可能存在层级跳级的情况。
第二步:用Blade递归渲染树形UI
现在有了结构清晰的树形数组,接下来用Blade的递归能力渲染,完全不用嵌套判断。
方法1:Blade组件(Laravel 7+推荐)
创建一个组件文件resources/views/components/position-tree-item.blade.php:
<li> {{ "Position level {$item['position_level']} - {$item['full_name']}" }} {{-- 如果当前节点有子节点,递归渲染 --}} @if(isset($item['children']) && count($item['children']) > 0) <ul> @foreach($item['children'] as $child) <x-position-tree-item :item="$child" /> @endforeach </ul> @endif </li>
然后在主视图resources/views/positions/tree.blade.php里调用组件:
<ul> @foreach($positionTree as $rootItem) <x-position-tree-item :item="$rootItem" /> @endforeach </ul>
方法2:递归包含视图(兼容旧版Laravel)
如果你的Laravel版本不支持组件,用@include递归调用视图也可以:
创建resources/views/partials/position-tree-item.blade.php:
<li> {{ "Position level {$item['position_level']} - {$item['full_name']}" }} @if(isset($item['children']) && count($item['children']) > 0) <ul> @foreach($item['children'] as $child) @include('partials.position-tree-item', ['item' => $child]) @endforeach </ul> @endif </li>
主视图里调用:
<ul> @foreach($positionTree as $rootItem) @include('partials.position-tree-item', ['item' => $rootItem]) @endforeach </ul>
额外优化:自定义显示细节
如果需要像你示例里那样只显示层级文本,或者添加样式、更多员工信息,直接调整组件/视图里的内容就行:
<li> <span class="font-medium">Position level {{ $item['position_level'] }}</span> <small class="ml-2 text-gray-500">{{ $item['full_name'] }} | 薪资:{{ $item['salary'] }}</small> @if(isset($item['children']) && count($item['children']) > 0) <ul class="ml-4 mt-1"> {{-- 用CSS缩进子节点,更直观 --}} @foreach($item['children'] as $child) <x-position-tree-item :item="$child" /> @endforeach </ul> @endif </li>
不管你的层级有多少层,这套逻辑都能轻松处理,再也不用写一堆嵌套判断啦!
内容的提问来源于stack exchange,提问作者Mr.Falstaff
相关产品推荐
相关产品推荐

