Laravel Blade模板中使用foreach按值将数组拆分为两个数组的实现方法
实现方案
方案1:对应你JS逻辑的直接实现
你可以通过Blade的@php指令编写原生PHP逻辑完成数组拆分,和你写的JS逻辑完全对齐:
{{-- 初始化两个空数组 --}} @php $navlinks = []; $legallinks = []; @endphp {{-- 遍历排序后的链接并分类存入数组 --}} @foreach($site->links()->orderBy('position')->get() as $link) @php if($link->type == 'nav') { $navlinks[] = $link; } if($link->type == 'legal') { $legallinks[] = $link; } @endphp @endforeach {{-- 后续直接使用两个数组即可 --}} @foreach($navlinks as $navLink) {{-- 渲染导航链接逻辑 --}} @endforeach @foreach($legallinks as $legalLink) {{-- 渲染法律类链接逻辑 --}} @endforeach
Blade视图中同页面用@php定义的变量无需声明global,后续代码可以直接调用。
方案2:更推荐的Laravel原生写法
$site->links()->orderBy('position')->get()返回的是Laravel集合(Collection)对象,你完全不需要手动遍历判断,直接用集合的筛选方法就能快速完成拆分,代码更简洁高效:
@php // 先一次性查询到所有排序后的链接 $allLinks = $site->links()->orderBy('position')->get(); // 直接按类型筛选,无需手动循环 $navlinks = $allLinks->where('type', 'nav'); $legallinks = $allLinks->where('type', 'legal'); @endphp
筛选后的集合和数组的遍历用法完全一致,同时只做了一次数据库查询,性能比手动遍历更好。
优化建议
如果这两个分类后的链接需要在多个视图中使用,建议把拆分逻辑放到控制器或者模型访问器中处理,不要放在Blade模板里,更符合MVC分层规范。
内容的提问来源于stack exchange,提问作者Kirk Ross
相关产品推荐
相关产品推荐

