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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

2回答

11369閲覧

Laravelで配列のforeachがうまくいかない

onakahetta

総合スコア23

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2019/01/24 07:43

前提・実現したいこと

お世話になっております。Laravel5.7.15で開発をしています。
DBから取得したデータを画面に表示し、そのまま次の画面でも同じように表示したいのですがうまくいきません。

発生している問題・エラーメッセージ

取得したデータは以下のようになっています。

[{"id":1,"account":"test01"},{"id":2,"account":"test02"},{"id":3,"account":"test03"},{"id":4,"account":"test04"}]

これをaccountsという名前でbladeに渡し、foreachで回して表示

Blade

1@foreach($accounts as $index => $account) 2 <span class="span">{{ $account['account'] }} </span> 3@endforeach

ここまではできているのですが、次の画面でも同じように表示したいと思い、

Blade

1<input type="hidden" value="{{ $accounts }}" name="accounts">

このようにしてpostで渡したところ、$accountsが丸ごと文字列として渡されてしまいforeachができませんでした。

なのでinputをこのように書き換え、

Blade

1@foreach($accounts as $index => $account) 2 <span class="span">{{ $account['account'] }} </span> 3 <input type="hidden" value="{{ $account['id'] }}" name="accounts[{{ $index }}][id]"> 4 <input type="hidden" value="{{ $account['account'] }}" name="accounts[{{ $index }}][account]"> 5@endforeach

この配列を次の画面に渡しました。

array ( 0 => array ( 'id' => '1', 'account' => 'test01', ), 1 => array ( 'id' => '2', 'account' => 'test02', ), 2 => array ( 'id' => '3', 'account' => 'test03', ), 3 => array ( 'id' => '4', 'account' => 'test04', ), )

多次元配列だったので次の画面で以下のように書いたのですが、Illegal string offset 'account' というエラーが出てしまいました。

Blade

1@foreach($accounts as $row) 2 @foreach($row as $account) 3 <span class="span">{{ $account['account'] }} </span> 4 @endforeach 5@endforeach

試したこと

以上のことを試したのですが、配列が苦手すぎて訳が分からなくなったので質問しました。
初歩的なところでミスをしている気がしますが、教えていただけるとありがたいです。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

viewからviewに渡そうとしてるのが間違い。
次の画面というのは
ルーティング→コントローラー→ビューの流れを再度繰り返してるだけなので
次の画面用の$accountsはコントローラーで取得しなおせばいい。

投稿2019/01/24 08:10

kawax

総合スコア10377

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

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

onakahetta

2019/01/24 08:27

ご回答ありがとうございます。 その方法も考えましたが、DB取得のために結局idが必要なのでそのままaccountも一緒に渡せるのではないかと思いこのように書きました。 あまり一般的な方法ではないのですね。勉強になりました。
guest

0

ベストアンサー

そういうときはデバッグだと思います。
このコードだと普通にPHPで配列組んで同じようにforeachしてもエラーが出ます。

本来はこうすべき

php

1foreach($accounts as $num=>$account){ 2 echo <<<EOF 3 <span class="span">{$account['account']} </span> 4EOF; 5}

as key=>value の形で定義します。

配列もそうですが、「この変数が今どのような状態か」はvar_dump()など(Laravelならdd()ですね)で確認してから使いましょう。

ちなみに元のforeachだと$rowに個々の中身の配列array ('id' => '1','account' => 'test01')などが入っていることがわかるはずです。
つまり中のforeachの$accountはidなりaccountのvalueが入ってきます。

php

1foreach($accounts as $row){ 2 var_dump($row); 3 foreach($row as $account){ 4 echo <<<EOF 5 {$account} 6EOF; 7 } 8} 9// 1 test01 2 test02 3 test03 4 test04

投稿2019/01/24 07:54

編集2019/01/24 07:59
m.ts10806

総合スコア80765

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

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

onakahetta

2019/01/24 08:17

ご回答ありがとうございます。 $rowの中身が配列というのは分かったのですが、その個々のidやaccountの中身を取り出すのはforeachではできないということなのでしょうか? 理解が乏しく申し訳ございません。
m.ts10806

2019/01/24 08:31

回答にコード書いてますが
onakahetta

2019/01/24 09:42

デバッグして、やっと理解できました。 記載いただいたコードで取得することができました。 本当にありがとうございます。
m.ts10806

2019/01/24 10:30

ただ、さすがにhiddenですべての渡すのはナンセンスで無駄な処理も多くなるのでせめてセッションで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問