Laravel中如何正确遍历多维PHP数组渲染手风琴数据
Laravel Blade嵌套循环渲染手风琴数据错误修复
问题场景
需要在Laravel Blade模板中通过嵌套foreach循环渲染多维数组中的手风琴数据,由于手风琴数量不固定必须使用嵌套循环,但目前无法正常加载accordion数组的数据,前端始终报错。
原数组定义(treatments.php)
'treatments' => [ [ 'img' => asset('img/logos/Dermatologie_Dr_med_Aresu_Naderi_Nienstedten_Logo.png'), 'title' => 'Klassische Dermatologie', 'teaser' => 'Ein wesentlicher Bestandteil im Behandlungskonzept meiner Hautarztpraxis ist die ästhetische Dermatologie und Lasermedizin.', 'pop-up' => 'derma', 'accordion' => [ [ 'title' => 'test', 'content' => 'test2', ], [ 'title' => 'test', 'content' => 'test2', ], ], ], ]
原Blade模板代码
<div class="row"> @foreach( $treatments as $key => $value) <?php print_r($value) ?> <div class="col-md-4 py-5"> <img class="w-100" src="{!! __($value['img']) !!}" alt="{!! __($value['title']) !!}"> </div> <div class="col-md-8 py-5"> <span class="treatmentsHeadline">{!! __($value['title']) !!}</span> <p class="pt-3">{!! __($value['teaser']) !!}</p> <div class="pt-3"> <button class="button-naderi" href="#{!! __($value['pop-up']) !!}">Mehr erfahren</button> <button class="button-naderi" href="#{!! __($value['pop-up']) !!}">Termin vereinbaren</button> </div> </div> @foreach($value as $acc) <p>{!! __($acc['title']) !!}</p> @endforeach @endforeach <p class="footer-vh"></p> </div>
错误原因
内层@foreach($value as $acc)遍历的是当前治疗项的所有键值对(包括img、title、teaser等字符串类型的值),当代码尝试访问$acc['title']时,$acc此时是字符串而非数组,因此会抛出非法字符串偏移量的错误。
修复后的Blade代码
需要将内层循环的遍历对象改为$value['accordion'],同时建议增加存在性判断,避免部分治疗项没有手风琴数据时报错:
<div class="row"> @foreach( $treatments as $treatment) <div class="col-md-4 py-5"> <img class="w-100" src="{!! __($treatment['img']) !!}" alt="{!! __($treatment['title']) !!}"> </div> <div class="col-md-8 py-5"> <span class="treatmentsHeadline">{!! __($treatment['title']) !!}</span> <p class="pt-3">{!! __($treatment['teaser']) !!}</p> <div class="pt-3"> <button class="button-naderi" href="#{!! __($treatment['pop-up']) !!}">Mehr erfahren</button> <button class="button-naderi" href="#{!! __($treatment['pop-up']) !!}">Termin vereinbaren</button> </div> </div> <!-- 渲染手风琴数据 --> @if(isset($treatment['accordion']) && is_array($treatment['accordion'])) @foreach($treatment['accordion'] as $item) <div class="accordion-item"> <h3>{!! __($item['title']) !!}</h3> <div>{!! __($item['content']) !!}</div> </div> @endforeach @endif @endforeach <p class="footer-vh"></p> </div>
说明
- 将循环变量重命名为
$treatment,比$value更具语义化,提高代码可读性 - 内层循环明确遍历
$treatment['accordion']数组,只处理手风琴数据 - 增加
isset()和is_array()判断,确保只有当手风琴数据存在且为数组时才执行循环,避免潜在错误
内容的提问来源于stack exchange,提问作者marlxnw
相关产品推荐
相关产品推荐

