このエラーは「文字列が入るべきところに、配列が受け渡されている」という意味。配列から値を取り出してあげれば、エラーを解決できます。
実際のコードを使って、どのように処理を行うか解説していきますね。
【エラーメッセージ】
Laravelのhtmlspecialchars() expects parameter 1 to be string エラー前提条件
まずは前提条件から説明していきますね。次のようにコントローラーを書いて配列を$menuに代入し、ビューファイルに受け渡したとします。
なお今回はテストのために、分かりやすく配列を使って、変数を定義しています。
【コントローラー】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public function array(Request $request) { // 配列を変数$menuに代入 $menu = array( 'salad' => array ( 'pricd'=>500, 'color'=>'green', ), 'main' => array ( 'pricd'=>1000, 'color'=>'yellow', ), 'dessert' => array ( 'pricd'=>600, 'color'=>'white', ), ); // $menuをビューファイルに受け渡す return view('array', compact('menu')); } |
ビューファイルは次のように表示します。
【ビューファイル(array.blade.php)】
1 |
{{$menu}} |
するとここで、エラーが発生します。
エラーを直訳すると、「htmlspecialchars()はパラメータ1が文字列であるところ、配列が与えられています。」といった意味です。
laravel では、 {{ }} を使って変数を表示するとき、 変数がhtmlspecialchars でエスケープ処理されます。
このとき、変数がstring(文字列)である必要があり、array(配列)が受け渡されると処理できません。配列が渡されると、このようなエラーが表示されます。
「エスケープ処理って?」と思ったら、下記の記事で分かりやすく解説しているので、併せて読んでくださいね。
Laravelのhtmlspecialchars() expects parameter 1 to be string エラーの解決3ステップ
解決策としては、配列→文字列にして表示することになります。
状況によって色々と方法がありますが、今回はarray_column関数を使って処理していきましょう。
ステップ①取り出したい値の場所をチェック
まずは表示したい値がどのような状態になっているのか、チェックしましょう。
コントローラーの変数を定義した後にdd(変数名)を挿入します。
【コントローラーにddを入れた例】
こうすると、次のように$menuの値がブラウザに表示されます。この時点で、配列であることが分かりますね。
ddを使うと、変数の内容を表示できるので、とっても便利です♪
ステップ②コントローラーで表示したい値だけ取り出す
次に配列を文字列にしていきます。今回は、$menuの中のcolor値を表示したいとします。
普通にとりだすには、コントローラに下記を加えます。
1 2 |
// 配列の値を取り出す $menu=$menu['salad']['color']; |
【コード追加後のコントローラ】
他にもarray_column関数を使ったコードを使う方法もあります。
1 2 |
// 配列の中から単一のカラムcolorを格納 $menu=array_column($menu, 'color'); |
array_column関数を使うと、配列の中から、単一のカラムの値を取り出せます。
コントローラーのメソッド全体は、次のようになります。
【array_column追加後のコントローラ】
ステップ③ビューファイルで表示
最後にビューファイルを編集します。コントローラーから受け渡された変数$menuには、salad, main, dessertのcolorが格納されています。
値をひとつずつ表示するために、foreachを使っていきます。
【ビューファイル(array.blade.php)】
1 2 3 |
@foreach($menu as $m) {{$m}}<br> @endforeach |
ブラウザには、次のようにcolorが表示されます。
もっと込み入った多次元配列の場合は、もう一工夫必要です。
もっと込み入った配列の場合には、もう少し工夫が必要です。
たとえば、次のような配列であったとしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 配列を変数$menuに代入 $menu = array( 'salad' => array ( 'color'=>array( 'tomate'=>'red', 'cucumber'=>'green' ), 'price'=>array( 'tomate'=>200, 'cucumber'=>300 ) ) ); |
この配列から ‘tomate’キーの値を取り出すには、コントローラに下記を加えます。
1 2 |
// 配列の値を取り出す $menu=$menu['salad']['color']['tomate']; |
【コード追加後のコントローラ】
array_columnを使う場合は、こちらを入れます。
1 2 |
// 配列の中から単一のカラムcolorを格納 $menu=array_column($menu['salad'], 'tomate'); |
【array_column追加後のコントローラ】
ビューファイルは先ほどと同じです。
1 2 3 |
@foreach($menu as $m) {{$m}}<br> @endforeach |
これによって、ブラウザにtomateキーの値だけ表示できます。
さいごに
配列の値を取り出してエラーを解決する方法を紹介しました。
あなたのエラー解決に役立てば嬉しいです。