PHPでArrayOptionクラスを作った
PHPのArrayは存在しないキーにアクセスすると、Noticeのエラーが発生する。
なので、isset()やら、array_key_exists()をしてから取りに行くのだけど、どうにも面倒だった。
最近覚えたScalaのgetOrElse()みたいなことができればいいなと思って、作ってみた。
json_decode()した結果を入れると、捗る。
こんな感じで使う
<?php require "./ArrayOption.php"; $j = json_decode('{"hoge":{"fuga":{"piyo":123}}}', $assoc = true); $arr = new ArrayOption($j); echo $arr->hoge->fuga->piyo->get(), "\n"; // 123 echo $arr->hoge->fuga->piyo->getOrElse(234), "\n"; // 123 echo $arr->hoge->fuga->foo->getOrElse(999), "\n"; // 999 var_dump($arr->hoge->get()); //array(1) { // 'fuga' => // array(1) { // 'piyo' => // int(123) // } //} $arr->abcde->get(); //PHP Fatal error: Uncaught exception 'ArrayOptionNoSuchElementException'
いいところ
get()とgetOrElse()で、キーの存在確認とクオートを打つ手間とプロパティ呼び出しの簡潔さがいい感じである。
悪いところ
毎回オブジェクト作ってるので、それなりに遅いです。
<?php $arr = ['hoge' => ['fuga' => ['piyo' => ['foo' => ['bar' => 123]]]]]; $count = 100000; for ($i = 1; $i <= $count; $i++) { $k = $arr['hoge']['fuga']['piyo']['foo']['bar']; } //=> 0.030924 sec for ($i = 1; $i <= $count; $i++) { $arroption = new ArrayOption($arr); $k = $arroption->hoge->fuga->piyo->foo->bar->get(); } //=> 2.622408
実に84倍の差が出てしまいました。