You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:23:23