php.7.3を使用していて、連想配列に値を代入しようとしたタイミングで、以下のような、「Illegal string offset ‘fuga’ in …」のエラーが出た。
Illegal string offset 'fuga' in ...
本記事では上記「Illegal string offset ‘fuga’ in …」のエラーが出たときの原因と対処法を解説する。
Illegal string offset ‘fuga’ in …が出る原因
「Illegal string offset ‘fuga’ in …」のエラーは、
配列でない変数に対して、配列のつもりで値を代入してしまうために起こるエラーだ。
指定された変数が配列ではなく文字列になっているからと言うのが原因だそう。
どう言うことかと言うと、以下のコードを見てもらいたい。
<?php
$aryTest = array(
'a' => 'テストだよ',
'b' => 'テストです',
'c' => 'テストだっつーの',
'd' => 'テストでげす',
'e' => 'テストだわいな',
);
$ary;
foreach ($aryTest as $key => $value) {
$ary[$key] = $value; # エラー
}
上記コードだと、foreach内で $ary にキー指定で値を入れようとしている行で、
「Illegal string offset ‘fuga’ in …」が出てしまう。
理由は、$ary[キー]に値を代入する時点で、$aryはまだ配列であることが宣言されていないからだ。
Illegal string offset ‘fuga’ in …を解決する方法
「Illegal string offset ‘fuga’ in …」を解決するには、
代入先の変数が配列であることを事前に宣言しておけば良い。
以下のコードを見て欲しい。
<?php
$aryTest = array(
'a' => 'テストだよ',
'b' => 'テストです',
'c' => 'テストだっつーの',
'd' => 'テストでげす',
'e' => 'テストだわいな',
);
$ary = array(); #配列であることを宣言
foreach ($aryTest as $key => $value) {
$ary[$key] = $value; # エラーが起きない。
}
「Illegal string offset ‘fuga’ in …」のエラーが出てしまった時のコードとの違いは、
$aryに事前に「= array();」として、配列であることを宣言しておいたかどうかである。
これで問題なく、「Illegal string offset ‘fuga’ in …」のエラーが出ることなくphp7以降は動作する。
補足: php8以降は、「Uncaught TypeError: Cannot access offset of type string on…」と表示される
補足として、見出し通りではあるが、php8以降の場合、
「Illegal string offset ‘fuga’ in …」ではなく、
「Uncaught TypeError: Cannot access offset of type string on…」
と表示される(かも、間違ってたらすいません)。
関連
参考:https://scrapbox.io/namaozi/PHP7%E3%81%A7Illegal_string_offset%E3%81%8C%E5%87%BA%E3%82%8B
https://www.php.net/manual/ja/language.types.string.php
【原因】
変数に値を代入する時点で、変数がまだ配列であることが宣言されていないから
【解決法】
事前に変数が配列であることを宣言しておく