FuelPHPでArr::get()をネストして使うと発生するエラーとその理由
以下のようなコードをViewに記述していたところ、エラーが発生しました。
Arr::get(Arr::get($array_1, Arr::get($array_2, 'HOGE')), 'FUGA');
発生したエラー
First parameter must be an array or ArrayAccess object. in /fuel/app/classes/extend/arr.php on line 9
✅ Arr::get() の仕様について
FuelPHPの Arr::get()
は、配列から値を安全に取得するための便利関数です。
Arr::get($array, $key, $default = null);
この関数は以下のように動作します:
-
$array[$key]
が存在すれば、その値を返す - 存在しなければ、第3引数
$default
(省略時はnull
)を返す - 存在しないキーでもPHPのNoticeやWarningを出さない安全なアクセスが可能
公式ドキュメント にも仕様が記載されています。
❌ 今回エラーになった理由
今回のコードでは Arr::get()
をネストして使用しています:
Arr::get(Arr::get($array_1, Arr::get($array_2, 'HOGE')), 'FUGA');
このとき、次のような流れでエラーが発生します:
-
Arr::get($array_2, 'HOGE')
の結果がnull
を返す - それをキーとして
Arr::get($array_1, null)
を実行 -
Arr::get()
の第一引数がnull
になる可能性があり、FuelPHPではこの場合にInvalidArgumentException
をスローする
つまり、Arr::get()
の第一引数が null
や配列以外の型になったことが原因でエラーが発生しています。
✅ 対策
ネストを避けて、変数に一度代入してからチェックすることでエラーを回避できます:
$key = Arr::get($array_2, 'HOGE');
$data = Arr::get($array_1, $key, []);
$value = Arr::get($data, 'FUGA', '');
または
Arr::get(Arr::get($array_1, Arr::get($array_2, 'HOGE'), []), 'FUGA', '');
または三項演算子を使ってより安全に:
echo ($key = Arr::get($array_2, 'HOGE')) && is_array($arr = Arr::get($array_1, $key))
? Arr::get($arr, 'FUGA', '')
: '';
✅ まとめ
-
Arr::get($array, $key)
はキーが存在しなくてもエラーにならず安全に使える - ただし、第一引数が配列でない場合(nullなど)には
InvalidArgumentException
が発生する - ネストして使うと、途中の戻り値が
null
になりやすいため注意が必要 - ネストを避けて中間変数に格納することで、読みやすく安全なコードになる
ネストして一見スマートに見えるコードでも、FuelPHPでは意図しない例外の原因となるため、慎重に使いましょう。