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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

4496閲覧

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

mango

総合スコア33

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

1グッド

1クリップ

投稿2018/09/25 13:41

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

問題点:文法的にどこが間違っていて、@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)"
mikan_s4n👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/09/25 13:55

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

回答1

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

1// 一般的なphpでの強制キャスト 2foreach ((array)$array as $elem) { 3  // hogehoge. 4} 5 6// lalabel-Blade用 方法① 7@forelse ((array)$post->comments as $comment) 8 9// lalabel-Blade用 方法② 10$arrComments = (array)$post->comments 11@forelse ($arrComments as $comment) 12

投稿2018/09/26 03:01

編集2018/09/26 06:31
mikan_s4n

総合スコア377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mango

2018/09/26 05:23

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

2018/09/26 06:34

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

2018/09/26 08:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問