PHPで Array to string conversion というエラーが出て困っていませんか?
この Array to string conversion は、配列(array)を文字列(string)として扱おうとしたときに発生する警告です。PHPが「配列を文字列に変換できません」と教えてくれているのです。
この記事では、Array to string conversion が発生する全7パターンと状況別の正しい対処法を、コード例付きで網羅的に解説します。
- Array to string conversionの意味とPHPバージョンによる違い
- Array to string conversionが発生する7つのパターン
- 対処法1:implode() で配列を文字列に結合
- 対処法2:json_encode() でJSON文字列に変換
- 対処法3:配列の特定要素にアクセスする
- 対処法4:print_r() / var_export() で配列を文字列化
- 対処法5:serialize() でシリアライズ
- 対処法6:is_array() で事前チェック
- Array to string conversion 対処法の使い分け早見表
- 実務でArray to string conversionが起きるケースと解決策
- Array to string conversionの原因を素早く特定する方法
- まとめ
- あわせて読みたい
Array to string conversionの意味とPHPバージョンによる違い
Array to string conversion は、PHPのバージョンによってエラーレベルが異なります。
| PHPバージョン | エラーレベル | メッセージ |
|---|---|---|
| PHP 7.x 以前 | Notice(通知) | Notice: Array to string conversion |
| PHP 8.0 以降 | Warning(警告) | Warning: Array to string conversion |
PHP 8.0 で Notice から Warning に格上げされました。今後のバージョンでさらに厳格化される可能性があるため、放置せず必ず修正しましょう。
Array to string conversionが発生する7つのパターン
1. echo / print で配列を直接出力
最も基本的なパターンです。配列を echo や print で出力しようとすると発生します。
$fruits = ['りんご', 'バナナ', 'みかん']; // NG: Array to string conversion echo $fruits; // 出力: "Array" + 警告
2. 文字列の連結に配列を使用
文字列と配列を .(ドット演算子)で連結しようとすると発生します。
$data = ['name' => '田中', 'age' => 25]; // NG: Array to string conversion $message = "ユーザー情報: " . $data;
3. ダブルクォート内で配列変数を展開
文字列中に配列変数を埋め込むと発生します。
$colors = ['赤', '青', '緑']; // NG: Array to string conversion echo "色の一覧: $colors";
4. sprintf / printf に配列を渡す
sprintf() の %s は文字列を期待するプレースホルダです。ここに配列を渡すと、文字列への変換が発生し警告が出ます。
$items = ['A', 'B', 'C'];
// NG: Array to string conversion
echo sprintf("結果: %s", $items);
5. (string) キャストで配列を変換
(string) や strval() による型キャストは、整数や浮動小数点には使えますが、配列に対して使うとエラーになります。
$array = [1, 2, 3]; // NG: Array to string conversion $str = (string) $array; // これも同じエラー $str = strval($array);
6. データベースのINSERT/UPDATEに配列を渡す
フォームデータやAPIレスポンスが配列のまま、SQLに渡してしまうケースです。
// フォームから配列が送られてくる場合
// <input name="tags[]" value="PHP">
// <input name="tags[]" value="Laravel">
$tags = $_POST['tags']; // ['PHP', 'Laravel']
// NG: Array to string conversion
$sql = "INSERT INTO posts (tags) VALUES ('$tags')";
補足:この例はエラーの再現コードです。実務では SQL を直接文字列連結せず、プリペアドステートメントを使いましょう。配列は implode() や json_encode() で文字列に変換してからバインドします。
// OK: プリペアドステートメント + json_encode
$stmt = $pdo->prepare("INSERT INTO posts (tags) VALUES (:tags)");
$stmt->execute([':tags' => json_encode($tags, JSON_UNESCAPED_UNICODE)]);
7. 多次元配列の要素アクセスミス
インデックスの指定が足りず、配列のまま文字列に変換しようとするケースです。
$users = [
['name' => '田中', 'age' => 25],
['name' => '鈴木', 'age' => 30],
];
// NG: $users[0] は配列
echo "名前: " . $users[0];
// OK: キーまで指定する
echo "名前: " . $users[0]['name'];
対処法1:implode() で配列を文字列に結合
配列の要素を区切り文字で結合して1つの文字列にします。最も一般的な対処法です。
$fruits = ['りんご', 'バナナ', 'みかん'];
// カンマ区切りで結合
echo implode(', ', $fruits);
// 出力: りんご, バナナ, みかん
// 改行で結合
echo implode("\n", $fruits);
// 区切りなしで結合
echo implode('', $fruits);
// 出力: りんごバナナみかん
注意:implode() は1次元配列にしか使えません。多次元配列の場合は json_encode() など後述の方法を使ってください。
join() はimplode() のエイリアス
join() と implode() はまったく同じ動作をします。好みで使い分けて構いませんが、PHPでは implode() のほうが一般的です。
// どちらも同じ結果
echo implode(', ', $fruits);
echo join(', ', $fruits);
implode() 以外の方法も含め、配列から文字列への変換テクニックは「【PHP】配列を文字列に変換する方法」でも詳しく解説しています。
対処法2:json_encode() でJSON文字列に変換
配列の構造をそのまま文字列化したい場合は json_encode() が便利です。APIレスポンスやログ出力に最適です。
$data = ['name' => '田中', 'age' => 25, 'skills' => ['PHP', 'MySQL']];
// JSON文字列に変換
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// 出力: {"name":"田中","age":25,"skills":["PHP","MySQL"]}
// 整形して出力(デバッグ用)
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
多次元配列もそのまま変換できるのが implode() にはない強みです。
PHPでのJSON操作全般については「【PHP】JSONを利用する方法」で詳しく解説しています。
対処法3:配列の特定要素にアクセスする
本当に必要なのが配列全体ではなく特定の値なら、インデックスやキーで要素を指定します。
$user = ['name' => '田中', 'email' => 'tanaka@example.com'];
// NG
echo "名前: $user";
// OK: 特定のキーを指定
echo "名前: " . $user['name'];
// 出力: 名前: 田中
// OK: 波括弧で囲む(文字列中で使う場合)
echo "名前: {$user['name']}";
多次元配列の場合
ネストが深い配列は、段階的にキーを指定します。
$response = [
'data' => [
'user' => [
'name' => '田中',
'address' => ['city' => '東京']
]
]
];
// NG: $response['data'] は配列
echo $response['data'];
// OK: 必要な深さまでキーを指定
echo $response['data']['user']['name']; // 田中
echo $response['data']['user']['address']['city']; // 東京
対処法4:print_r() / var_export() で配列を文字列化
デバッグ目的で配列の中身を文字列として取得したい場合に使います。
$array = ['PHP', 'JavaScript', 'Python'];
// 画面に出力(デバッグ用)
print_r($array);
// Array ( [0] => PHP [1] => JavaScript [2] => Python )
// 文字列として取得(第2引数にtrue)
$str = print_r($array, true);
file_put_contents('debug.log', $str);
// var_export: PHPの配列構文で出力
$str = var_export($array, true);
// array ( 0 => 'PHP', 1 => 'JavaScript', 2 => 'Python', )
| 関数 | 出力形式 | 用途 |
|---|---|---|
print_r() |
人が読みやすい形式 | デバッグ出力・ログ |
var_export() |
PHPコードとして有効な形式 | 設定ファイル生成・キャッシュ |
var_dump() |
型情報を含む詳細形式 | 型のデバッグ |
対処法5:serialize() でシリアライズ
データベースやファイルに配列を保存する場合、serialize() で文字列化できます。
$config = ['theme' => 'dark', 'lang' => 'ja'];
// シリアライズ(文字列化)
$serialized = serialize($config);
echo $serialized;
// a:2:{s:5:"theme";s:4:"dark";s:4:"lang";s:2:"ja";}
// アンシリアライズ(復元)
$restored = unserialize($serialized);
echo $restored['theme']; // dark
セキュリティ上の注意:ユーザー入力を unserialize() に渡すのは非常に危険です(オブジェクトインジェクション脆弱性)。外部データには json_encode() / json_decode() を使いましょう。
対処法6:is_array() で事前チェック
変数が配列か文字列か不明な場合(フォーム入力、APIレスポンスなど)は、事前にチェックして処理を分岐します。
$input = $_POST['data']; // 文字列 or 配列
if (is_array($input)) {
// 配列の場合 → 結合して文字列にする
$value = implode(', ', $input);
} else {
// 文字列の場合 → そのまま使う
$value = $input;
}
echo $value;
三項演算子で簡潔に書く
$value = is_array($input) ? implode(', ', $input) : $input;
この方法は、チェックボックスや select multiple など、単一値と複数値の両方が送信される可能性があるフォームの処理で特に有効です。
Array to string conversion 対処法の使い分け早見表
| やりたいこと | 関数 | 例 |
|---|---|---|
| 要素を区切り文字で連結 | implode() |
implode(', ', $arr) |
| 配列構造を保持して文字列化 | json_encode() |
json_encode($arr) |
| 1つの要素だけ取得 | 添字アクセス | $arr['key'] |
| デバッグ・ログ出力 | print_r() |
print_r($arr, true) |
| DBに配列を保存 | json_encode() |
json_encode($arr) |
| 型が不明な変数を安全に処理 | is_array() |
is_array($v) ? implode(...) : $v |
実務でArray to string conversionが起きるケースと解決策
フォームのチェックボックスで発生
HTMLのチェックボックスは name="items[]" のように記述すると、PHPには配列として送信されます。
// HTML
// <input type="checkbox" name="lang[]" value="PHP">
// <input type="checkbox" name="lang[]" value="Python">
// <input type="checkbox" name="lang[]" value="Ruby">
// PHP側
$languages = $_POST['lang']; // ['PHP', 'Python']
// NG: 配列をそのまま出力
echo "選択した言語: $languages";
// OK: implode()で結合
echo "選択した言語: " . implode(', ', $languages);
// 出力: 選択した言語: PHP, Python
// OK: DBに保存するならJSON
$json = json_encode($languages, JSON_UNESCAPED_UNICODE);
// 保存: ["PHP","Python"]
APIレスポンスの処理で発生
外部APIのレスポンスをデコードすると、一部のフィールドが配列になっていることがあります。
$response = json_decode($apiResult, true);
// $response['tags'] が ['php', 'laravel'] のような配列の場合
// NG
echo "タグ: " . $response['tags'];
// OK
echo "タグ: " . implode(', ', $response['tags']);
// 安全な書き方(配列かどうか不明な場合)
$tags = $response['tags'] ?? '';
echo "タグ: " . (is_array($tags) ? implode(', ', $tags) : $tags);
Laravelで発生するケース
Laravelでは、Eloquentのリレーション結果やCollectionを文字列として扱おうとすると発生します。
// NG: リレーション結果は配列/Collection
$user = User::find(1);
echo $user->roles; // Array to string conversion
// OK: pluck + implode
echo $user->roles->pluck('name')->implode(', ');
// 出力: 管理者, 編集者
// OK: toJson()
echo $user->roles->toJson();
WordPressで発生するケース
WordPressの get_post_meta() は第3引数によって返り値の型が変わります。
// 第3引数 false(デフォルト)→ 配列を返す $value = get_post_meta($post_id, 'my_field'); // ['値1'] のような配列 → echo すると警告 // 第3引数 true → 単一の値を返す $value = get_post_meta($post_id, 'my_field', true); // '値1' という文字列 → echo OK echo $value;
Array to string conversionの原因を素早く特定する方法
「どの変数が配列なのかわからない」場合は、以下の手順でデバッグします。
1. gettype() で型を確認
$unknown = someFunction(); echo gettype($unknown); // "array" と表示されたら配列
2. var_dump() で中身と型を同時に確認
var_dump($unknown);
// array(3) { [0]=> string(3) "PHP" ... }
3. エラーメッセージの行番号を確認
Warning: Array to string conversion in /path/to/file.php on line 42
エラーメッセージの on line 42 が示す行で、文字列として使われている変数を特定し、その変数が配列になっていないか確認しましょう。
そもそもエラーメッセージが画面に表示されない場合は「【PHP】エラー表示を有効にする方法」を確認してください。
まとめ
Array to string conversion エラーは、配列を文字列として扱おうとしたときに発生する警告です。
状況別の対処法フローチャート:
| あなたの状況 | 使うべき対処法 |
|---|---|
| 配列の要素を「, 」区切りなどで表示したい | implode(', ', $arr) |
| 配列の構造ごと保存・送信したい | json_encode($arr) |
| 配列の中の1つの値だけ使いたい | $arr['key'] で直接アクセス |
| デバッグで配列の中身を確認したい | print_r($arr) または var_dump($arr) |
| 変数が配列かどうかわからない | is_array($v) で事前チェック |
| フレームワーク(Laravel等)で発生した | 上の「実務でよくあるケース」を参照 |
ポイント:
- PHP 8.0以降は Warning に格上げされた(放置NG)
- 原因は echo、文字列連結、sprintf など配列を文字列の文脈で使ったこと
implode()が最も基本的な解決策- 構造を保持したいなら
json_encode() - 型が不明なら
is_array()で事前チェック
エラーメッセージの行番号から原因の変数を特定し、この記事で紹介した対処法の中から適切なものを選んで修正しましょう。
