PHP で変数などを echo で出力した時に、Array と表示されてしまうことがあります。原因と、Array についての解説をしていきます。
原因
Array と出力されてしまうのは、簡単に言うと「配列」を出力しようとしているためです。文字列や数値は出力することが出来ますが、配列やオブジェクトを echo で出力することはできません。( Array というのは日本語で「配列」のこと)
※解説が長いので、出力を行いたい方は下まで飛ばしてください
そもそも配列とは?
配列は、一つの箱のようなものに複数の値が入っているような状態を指します。複数入っているとはどういうことなのか、まずは値が一つだけ入っている例をみてみましょう。
例:$x に 1 が入っている
$x = 1;
echo $x;
x
に1
を代入しています。ここでx
を出力してみると、1
が表示されるのは分かりますよね!
次に下記のように「配列」に値を入れてから出力してみます。
$fruits = ['りんご', 'ばなな', 'すいか'];
echo $fruits; // Array と表示される
[]
を使うことで配列を定義し、その箱には値をカンマ区切りで入れることが出来ます。その箱を$fruits
という変数に代入している形です。
[ 値, 値, ... ]
はarray( 値, 値, ... )
でも全く同じ意味になります。古いバージョンの PHP では後者の形式でないとエラーになってしまいますが、今後は[ 値, 値, ... ]
を使った方が良いでしょう。
この例では$fruits
に果物の情報がいくつか入っていますが、その箱自体を echo すると Array と表示さます。そう、PHP はこの箱自体を echo することはできないのです。
これでは困ってしまいます。もしもこの中身を出力したいなら「どの果物を出力するか?」を指定してあげる必要があります。
配列は、変数名[ 番号 ] で値を取り出すことが出来ます。
$fruits = ['りんご', 'ばなな', 'すいか'];
echo $fruits[0]; // 0番目が一番最初なので、「りんご」が出力される
これで配列から値を取り出すことができました。しかし、この配列の中身を全て取り出そうとしたとき、下記のように箱の一つ目、箱の二つ目…というように順番に出力していてはやってられませんね。
$fruits = ['りんご', 'ばなな', 'すいか'];
echo $fruits[0]; // りんご
echo $fruits[1]; // ばなな
echo $fruits[2]; // すいか …めんどくさい!
まだ要素が3つなので楽ですが、できれば同じことは繰り返したく無いものです。次に配列の中身を全てまとめて出力する方法を紹介します。
配列をまとめて出力したい
その前に中身を確認する
Array と出力されると、中身に何が入ってるのか分からないのでまずは中身を確認してみます。echo
では出力できませんが、var_dump()
を使うことで配列の中身を確認できます。
$fruits = ['りんご', 'ばなな', 'すいか'];
var_dump( $fruits );
今回は自分で定義したため中身は分かりますが、もし Array の中身が分からない時は一度確認してどうなっているのか見てみましょう。こちらの例では次のような文字列が出力されるはずです。
array (3) {
...中身が表示される...
}
※もし本番環境で試さなくてはならない時、var_dump()
のデータが実際にサイト上に表示されるのは良くありません。一瞬だけ確認したいということであれば、出力自体を HTML コメントアウトする方法もあります。とはいえ、ソースコード上には出てきてしまうので、重要なデータを含む配列を出力させることは避けましょう。
<!--
この領域はHTMLなので出力されてもソースコードにしか出てこない
<?php var_dump( $fruits ) ?>
-->
中身が確認できたところで、この中身を全て出力させたい時には下記を使います。
(1)ループを使う
配列はforeach
でループさせることができるため、下記のようにしてもすべての果物を出力させることができます。
$fruits = ['りんご', 'ばなな', 'すいか'];
foreach ( $fruits as $fruit ) {
echo '<li>' . $fruit . '</li>';
}
例として<li>
タグに入れてみました。
(2)implode() を使う
シンプルに「,」区切り等にしたい時はこの方法がおすすめです。
PHP の関数implode()
を使うとかなりシンプルに配列をまとめられます。ここでは、カンマ区切りで果物たちを表示させてみます。
$fruits = ['りんご', 'ばなな', 'すいか'];
echo implode( ',', $fruits ); // 「りんご,ばなな,すいか」と表示される!
implode()
は第一引数の文字で配列のそれぞれの値を分割、文字列として結合してくれる便利な関数です。今回は「カンマ区切り」にしたかったので、第一引数は','
としています。配列の中にさらに配列がある多次元配列では使えませんが、サクッと出力したい時はおすすめです。
implode()
の逆で、文字列を特定の区切り文字で配列化するexplode()
というのもあります。
explode( ',', 'りんご,ばなな,すいか '); // カンマで文字列が分割され、['りんご', 'ばなな', 'すいか'] の Array 形式に戻る
他にも PHP では配列を操作する関数がたくさんあるので、ぜひ調べてみてください。
連想配列について
ここで「連想配列」についてもまとめておきます。連想配列とは、先ほどの番号の部分に名前をつけられるようになった配列のことです。例えば、下記のような[値段,色]
のデータ配列を定義するとします。
$fruits_data = [
[100, '赤'], // りんご
[200, '黄'], // ばなな
[500, '緑'], // すいか
];
echo $price_data[0][0]; // りんごの値段 100 が出力
$fruits_dataの0番目にある、0番目のデータを echo していますが、これらのデータを番号で取り出すのは非常に分かりにくいです。
キーの名前をつけてみる
こういった場合は番号の形式ではなく、名前を付けて分かりやすくします。
キーとなる名前
=> 値
で名前を付けることが出来ます。
$fruits_data = [
'りんご' => [100, '赤'],
'ばなな' => [200, '黄'],
'すいか' => [500, '緑'],
];
echo $price_data['りんご'][0]; // りんごの値段 100 が出力
今度は$fruits_dataの「りんご」のデータを echo しています。何のくだものの値段を出力しているのか、コメントアウトを書かなくても分かりやすいです。
さらに[0]
が何を示しているのか分かりやすくするために、キーの名前を増やして
$fruits_data = [
'りんご' => [
'price' => 100,
'color' => '赤',
],
];
echo $fruits['りんご']['price']; // 100 が出力
このようにするのも良いかもしれません。
連想配列の出力
ちなみに連想配列の'キー' => '値'
をループで出力するには、foreach
を使います。
$fruits_data = [
'りんご' => [
'price' => 100,
'color' => '赤',
],
];
foreach ( $fruits_data as $key => $val ) {
echo $key; // りんご
echo $val['price']; // 100
echo $val['color']; // 赤
}
$key
や$val
は仮の変数名なので、自分で分かりやすい名前に変更して使いましょう。