Laravel Blade中foreach循环计数器不递增如何解决
问题原因
你将$counter = 1的初始化逻辑写在了@foreach循环体内部,每一轮循环启动时都会执行这行赋值语句,把计数器强制重置为1。即使你在循环末尾对$counter做了+1操作,下一轮循环开头立刻就会把值覆盖回1,最终所有迭代输出的计数器值永远是1。
解决方法
优先使用Blade内置的$loop变量(官方推荐,无额外维护成本)
Laravel Blade的@foreach指令原生提供了$loop实例变量,不需要手动定义计数器,直接读取属性即可拿到当前迭代的序号:
$loop->iteration:当前循环的迭代计数,从1开始递增,完全匹配你生成1、2、3...序号的需求$loop->index:当前循环的索引值,从0开始递增,适合需要0起始序号的场景
修改后的可直接运行的代码如下:
<div id="dynamic_field"> @foreach($niloufars as $niloufar) <div class="row"> <div class="col-md-6"> <div class="form-group"> <span class="text-danger force-required"></span> <label for="niloufar_name">Title</label> <input type="text" class="form-control" name="niloufar_name_{{ $loop->iteration }}" value="{{ $niloufar->name }}"> </div> </div> <div class="col-md-6"> <div class="form-group"> <span class="text-danger force-required"></span> <label for="niloufar_link">Link</label> <input type="text" class="form-control" name="niloufar_link_{{ $loop->iteration }}" value="{{ $niloufar->link }}"> </div> </div> </div> @endforeach </div>
上述代码渲染后会自动生成带连续序号的name属性,不会出现重复值。
手动维护计数器(仅作原理演示,不推荐生产环境使用)
如果一定要自行实现计数器逻辑,必须把计数器的初始化语句移到@foreach循环外部,保证初始化逻辑只执行一次,不会被每轮循环重置:
<div id="dynamic_field"> {{-- 计数器初始化放在循环外,仅执行一次 --}} @php $counter = 1; @endphp @foreach($niloufars as $niloufar) <div class="row"> <div class="col-md-6"> <div class="form-group"> <span class="text-danger force-required"></span> <label for="niloufar_name">Title</label> <input type="text" class="form-control" name="niloufar_name_{{ $counter }}" value="{{ $niloufar->name }}"> </div> </div> <div class="col-md-6"> <div class="form-group"> <span class="text-danger force-required"></span> <label for="niloufar_link">Link</label> <input type="text" class="form-control" name="niloufar_link_{{ $counter }}" value="{{ $niloufar->link }}"> </div> </div> </div> @php $counter++; @endphp @endforeach </div>
手动维护计数器容易因初始化位置错误、作用域混淆产生隐蔽bug,除非有特殊定制需求,否则优先使用框架内置的
$loop变量实现迭代计数。
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

