1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Arr::get()で注意すべき点

Posted at

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');

このとき、次のような流れでエラーが発生します:

  1. Arr::get($array_2, 'HOGE') の結果が null を返す
  2. それをキーとして Arr::get($array_1, null) を実行
  3. 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では意図しない例外の原因となるため、慎重に使いましょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?