Laravel - локальная переменная foreach перезаписывает глобальную переменную - PullRequest
0 голосов
/ 23 сентября 2018

Сегодня я столкнулся с очень странной проблемой.У меня есть контроллер, откуда я посылаю три переменные для представления sections thread и threads.На мой взгляд, я перебираю все разделы с циклом foreach, как это:

@foreach($sections as $i => $section)

, и для каждого раздела я создаю div и присваиваю этот идентификатор следующим образом:

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

теперь в этом div я перебираю все потоки, как это:

@foreach($threads as $thread)

и создаю 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());
    }

View:

@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

Теперь вот скриншот отрендеренного html:

Rendered Html

Имя потока - page-172. Идентификатор для первого div отображается хорошо, но посмотрите на его id двух других div section-341который является последним элементом в threads

1 Ответ

0 голосов
/ 23 сентября 2018

но мой вопрос: почему это происходит?почему эта локальная переменная перезаписывает мою глобальную переменную

Поскольку php не может различить $thread и $thread.

Хотя вы можете ожидать переменную $thread в контекстеforeach($threads as $thread) жить только в теле foreach, в php это не так.

Локальная переменная $thread существует в пределах вашего представления, а не вашего тела цикла.Поскольку php не делает различий, оригинал перезаписывается.

...