オープンソースこねこね

Webプログラミングなどについてあれこれ。

PHPのArrayを少し便利に扱えるクラスを書いた。

大したコード量じゃないので毎回コピペして使ってたコードなのですが、せっかくなのでテスト書いて、TravisCIとCoverallsでテストして、Packagistに登録してみました。

https://github.com/kohkimakimoto/EArray

EArray

PHPで配列にアクセスするとき存在しないキーで値を取得しようとすると、警告がでます。

<?php
$arr = array("key_a" => "aaa");
echo $arr["key_b"];
// PHP Notice:  Undefined index: key_b ...

で、これを避けるために事前にキーの存在をチェックする処理をいれたりするんですが、いちいちこのコードを書くのが地味に面倒なのですよね。

$arr = array("key_a" => "aaa");
echo isset($arr["key_b"]) ? $arr["key_b"] : null;

これ、多次元配列だと更に面倒。

@(アットマーク)を配列の前につけてエラー出力しないように制御する方法もありますが、単に警告を無視してることになって、どうにも「その対応は違うだろ」って気持ちになってやりたくないですし。

そんなわけで、前述のEArrayというクラスを書きました。使い方は対象の配列をコンストラクタで登録してgetメソッドを使ってアクセスする。キーが存在しない場合、デフォルトでnullを戻します。

use Kohkimakimoto\EArray\EArray;

$earray = new EArray(array("foo" => "bar"));
$earray->get("foo");
$earray->get("foo2", "default");  // 第二引数でキーが存在しない時に戻す値を指定できる。

多次元配列の場合は、スラッシュ区切りの記法でスマートにアクセスできます。

$earray = new EArray(
    array(
        "foo" => array(
            "foo2" => array(
                "foo3",
                "foo4",
                ),
            "foo2-1" => "foo5",
            ),
        "bar",
        "hoge",
        )
);

$earray->get("foo/foo2-1");             # "foo5"を戻す。
$earray->get("foo.foo2-1", null, ".");  # キーにスラッシュが含まれている場合は第三引数で区切り文字を指定すればいい。

なお、ArrayAccessやIteratorインターフェースを実装しているので、普通の配列としてもオペレーションできます。 他にもREADMEにサンプルコードをいくつか書いておいたので参考にしてください。

https://github.com/kohkimakimoto/EArray/blob/master/README.md

インストール

composerを使います。composer.jsonに以下の行を追加してcomposer installすればいいと思います。

"kohkimakimoto/earray": "1.1.*"

まあ、クラスファイル一個だけなので、ちょっと使いたい人は以下のコードをコピペしてネームスペース定義を変えるとかしてもいいかもしれません。

https://raw.github.com/kohkimakimoto/EArray/master/src/Kohkimakimoto/EArray/EArray.php

ちなみにEArrayのEはExtendedの意味です。