質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.96%

forelse文に対して、Invalid argument supplied for foreach() のエラーが出る

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 3,066

score 17

目標:エラーの原因を知り、解決したい

問題点:文法的にどこが間違っていて、@forelse文に対してErrorException (E_ERROR)が発生しているのかが分からない

@extends('layouts.default')

@section('title', $post->title)

@section('content')
<h1>
  <a href="{{ url('/') }}" class="headder-menu">Back</a>
  {{ $post->title }}
</h1>
<p>{!! nl2br(e($post->body)) !!}</p>

<h2>Comments</h2>
<ul>
  @forelse ($post->comments as $comment)
  <li>
    {{ $comment->body }}
  </li>
  @empty
  <li>No comments yet</li>
  @endforelse
</ul>

@endsection

上記のコードに対して下記のエラーが発生

<?php $__env->startSection('content'); ?>
<h1>
  <a href="<?php echo e(url('/')); ?>" class="headder-menu">Back</a>
  <?php echo e($post->title); ?>

</h1>
<p><?php echo nl2br(e($post->body)); ?></p>

<h2>Comments</h2>
<ul>
  <?php $__empty_1 = true; $__currentLoopData = $post->comments; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $comment): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
  <li>
    <?php echo e($comment->body); ?>

  </li>
  <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
  <li>No comments yet</li>
  <?php endif; ?>
</ul>

<?php $__env->stopSection(); ?>

<?php echo $__env->make('layouts.default', \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ?>
Arguments
"Invalid argument supplied for foreach() (View: /home/vagrant/laravel_lessons/myblog/resources/views/posts/show.blade.php)"
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/09/25 22:55

    $post->comments がnullだったり配列でなかったりしませんか?

    キャンセル

回答 1

checkベストアンサー

0

Invalid argument supplied for foreach() 
は、foreachで配列を回そうとしている時にnullだと起きるエラーです。

lalavelの仕様はよくわかってはいないのですが、@emptyというのは恐らく空であればという条件だと思うのでnull対策になっているのでしょうね。

ということで考えられるのは $post->comments が、そもそも配列としてわたってきていないのでは?というところになります。
$post->comments を強制的に配列にキャストすればもしかしたらうまくいくかもしれません。

// 追記 2018/09/26 15:16
強制的にキャストする方法ですが、以下のように(array)$arrayの形で出来たかと思います。
方法①のようにlalabelのBladeでこれがそのまま使えるかは不明ですが、PHPの標準機能のはずなのでおそらくは使えるはず。
もしダメでも方法②のように直前で強制キャストを行い、@forelseに渡すものを配列にすれば行くはずです。

// 一般的なphpでの強制キャスト
foreach ((array)$array as $elem) {
  // hogehoge.
}

// lalabel-Blade用 方法①
@forelse ((array)$post->comments as $comment)

// lalabel-Blade用 方法②
$arrComments = (array)$post->comments
@forelse ($arrComments as $comment)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/26 14:23

    回答ありがとうございます!
    知識が浅いので申し訳ないですが、どのようにすれば強制的に配列にキャストできますか?

    キャンセル

  • 2018/09/26 15:34

    ちなみに「強制的にキャスト」と仰々しく書いてしまいましたが、「php 配列 キャスト」で検索すれば出てくる一般的なキャスト方法です。
    今回はnullだろうが空だろうがもうなんでもかんでもキャストしてしまえ。ということで「強制的に」という言葉を使っているだけです。

    キャンセル

  • 2018/09/26 17:03

    できました!
    ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る