Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

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倍の差が出てしまいました。