【PHP】Warning: Array to string conversion の原因と対処方法

PHPで echo したときに「Warning: Array to string conversion in …」と表示されることがあります。これは配列を文字列として扱おうとしたときに出る警告です。この記事では、エラーの正体とよくある原因、そして用途に応じた正しい対処方法を解説します。

この記事の結論:このエラーは配列をそのまま文字列にしようとしたときの警告です。中身を確認したいなら print_r()、1行に連結したいなら implode()、構造ごと出すなら json_encode() を使います。多くは多次元配列や誤ったインデックス指定が原因です。
スポンサーリンク

エラーの正体

これは致命的エラーではなく警告(Warning)です。処理自体は止まらず続きますが、配列の部分は文字列 「Array」 に変換されて出力されます。

配列を文字列にしようとすると
<?php
$array = [1, 2, 3];
echo "The array is: " . $array;
// Warning: Array to string conversion ...
// 出力: The array is: Array  ← 中身ではなく "Array" になる

ダブルクォート内に配列を埋め込んだ場合("$array")も同様に発生します。

よくある原因:ネスト配列とインデックスの取り違え

実務で多いのは、取り出したつもりの値がまだ配列だったケースです。DBの取得結果やフォーム送信値(チェックボックスなど)で起こりがちです。

実際によくあるパターン
<?php
// 例1: DBの行をそのまま出力(本当は列を指定すべき)
$row = ["id" => 1, "name" => "佐藤"];
echo $row;          // Warning(echo $row["name"]; が正しい)

// 例2: 多次元配列の階層を取り違える
$users = [["name" => "佐藤"], ["name" => "鈴木"]];
echo $users[0];     // Warning(echo $users[0]["name"]; が正しい)

// 例3: チェックボックスなど配列で送られる $_POST
// <input type="checkbox" name="tags[]"> → $_POST["tags"] は配列
echo $_POST["tags"]; // Warning(implode や foreach で処理する)
まず「その変数は本当に文字列か?」を確認しましょう。var_dump($x) で型を見れば、配列なのか文字列なのかすぐ分かります。配列だった場合は、正しいキー($x["name"] など)まで掘り下げているか見直します。

用途別の対処方法

中身を確認したい:print_r / var_dump

デバッグで中身を見たいだけなら print_r()var_dump() を使います。

print_r / var_dump
<?php
$array = [1, 2, 3];
print_r($array);  // 構造を見やすく表示
var_dump($array); // 型と値を詳しく表示

1行の文字列にしたい:implode

配列を区切り文字でつないで1つの文字列にするなら implode() です。

implodeで連結
<?php
$array = [1, 2, 3];
echo "The array is: " . implode(", ", $array); // The array is: 1, 2, 3
implode() は多次元配列には使えません。要素自体が配列だと、その部分はやはり「Array」になり警告が出ます(例: implode(",", [[1,2],[3,4]])Array,Array)。入れ子のデータは json_encode() か、ネストした foreach で処理します。

構造ごと文字列化したい:json_encode

多次元配列をログや確認用にそのまま文字列化したいときは json_encode() が便利です。

json_encodeで構造化して出力
<?php
$data = [["name" => "佐藤"], ["name" => "鈴木"]];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// [{"name":"佐藤"},{"name":"鈴木"}]

要素を1つずつ処理したい:foreach

foreachで個別処理
<?php
$array = [1, 2, 3];
foreach ($array as $value) {
    echo "Value: " . $value . "\n";
}
配列を文字列に変換する方法は配列を文字列に変換する方法、JSONの扱いはJSONを利用する方法、foreachの基本はforeachで配列を順番に操作する方法で解説しています。

よくある質問(FAQ)

Qこのエラーが出てもプログラムは止まりますか?
A止まりません。これはWarning(警告)なので処理は続きます。ただし配列部分は文字列「Array」になってしまうため、表示や保存が意図どおりになりません。早めに直しましょう。
Q原因の見つけ方が分かりません。
A警告に出ている行番号の変数を var_dump() で確認してください。その変数が配列なら、正しいキーまで掘り下げているか$row["name"] など)を見直します。DBの行やチェックボックスの $_POST でよく起こります。
Qimplodeを使ったのにまだ警告が出ます。
A配列が多次元(入れ子)になっている可能性があります。implode() は要素が配列だと処理できません。入れ子のデータは json_encode() か、ネストした foreach で扱ってください。
Q配列を見やすく確認したいだけです。
Aprint_r($array) または var_dump($array) を使います。print_r は構造を、var_dump は型と値を詳しく表示します。

まとめ

「Array to string conversion」への対処を整理します。

  • 配列を文字列にしようとしたときの警告(配列は「Array」になる)
  • 多くは多次元配列・インデックスの取り違えが原因 → var_dump で型確認
  • 確認は print_r / var_dump
  • 連結は implodeネスト不可)、構造化は json_encode
  • 要素ごとの処理は foreach

関連として、配列を文字列に変換する方法JSONを利用する方法文字列結合のテクニックもあわせて読むと、PHPの配列・文字列処理に強くなれます。