Laravel - foreach 局部变量正在覆盖全局变量

She*_*zad 4 php laravel-5 laravel-blade

今天我遇到了一个非常奇怪的问题。我有一个控制器,我将三个变量发送到视图sections threadthreads。在我看来,我正在使用 foreach 循环遍历所有部分,如下所示:

@foreach($sections as $i => $section)
Run Code Online (Sandbox Code Playgroud)

对于每个部分,我创建一个 div 并给出该 id,如下所示:

id="{{ $thread->slug }}-{{ $section->slug }}

现在在这个 div 中我正在循环遍历所有线程,如下所示:

@foreach($threads as $thread)
Run Code Online (Sandbox Code Playgroud)

并为每个线程创建div。现在的问题是,当线程循环完成线程中存储在局部变量 thread 中的最后一项时,会覆盖从视图发送的线程变量。现在,我知道要解决这个问题,我可以将 foreach 循环中的局部变量重命名为其他名称,但我的问题是为什么会发生这种情况?为什么这个局部变量会覆盖我的全局变量?

这是我的控制器:

    public function show($slug)
    {
        return view('thread.show')
            ->with('sections', Section::all())
            ->with('threads', Thread::all())
            ->with('thread', Thread::where('slug', $slug)->first());
    }
Run Code Online (Sandbox Code Playgroud)

看法:

@foreach($sections as $i => $section)
 <div class="tab-pane fade" id="{{ $thread->slug }}-{{ $section->slug }}">
  @foreach($threads as $thread)
   <div class="card mb-3">
    {{--/// Some Html--}}
   </div
  @endforeach
 </div>
@endforeach
Run Code Online (Sandbox Code Playgroud)

现在这是渲染的 html 的屏幕截图:

渲染的 HTML

线程名称是 page-172 第一个 div 的 id 渲染得很好,但是看看其他两个 div 的 id, section-341这是threads

Str*_*dox 6

但我的问题是为什么会发生这种情况?为什么这个局部变量会覆盖我的全局变量

因为php无法区分$thread$thread

$thread虽然您可能期望上下文中的变量foreach($threads as $thread)仅存在于foreach主体内,但在 php 中情况并非如此。

局部变量$thread存在于您的视图范围内,而不是您的循环体中。由于php不区分,所以原来的就被覆盖了。