SHIRANGANA PHP 忍者ブログ
エンジニア日記
Admin / Write
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

phpにおいて所々で自作される「array_get」は大変便利な関数です。
Laravelのhelperにも入っています。

一般的な実装としては、「配列から与えられたキーの値を返す」というシンプルなもので、
たいていは3つの引数をとります。

第1引数 = 配列
第2引数 = キー
第3引数 = 値がなかった場合に返す値

Laravelはドット区切りの設定ファイルを取り扱うので、
'hoge.fuga' なんてキーを渡すと
$array['hoge']['fuga']
を探してくれるようなものを実装したりしていますね。

私も業務アプリを書くことが多かったので
多重の配列を取り扱うことが多く、階層を掘れるarray_getがほしい場面がたまにありました。
掘る階層の位置を動的に変える事に対応するため、引数に配列を許可し、
配列を許可した場合はその順番に階層を掘るという動きをさせるようにしました。 自作したソースは下記です。


<?php
/**
 * array_get の再帰版
 *
 * 配列$arrayのキー$key(数値 or 文字 or 配列)の値を取得する。
 * 配列で指定した場合、要素の順番に配列を掘っていく。
 * 例外が発生した場合$defaultを返す。
 *
 * @param array $array   探す配列
 * @param mixed $key     探すキー。階層を掘る場合は配列で指定する
 * @param mixed $default 値がなかった場合に返すデフォルト値
 *
 * $array['key1']['key2']['key3'] の値が欲しければ
 *
 * $key = array('key1', 'key2', 'key3');
 * $value = aget($array, $key); と書ける。
 */
function aget($array, $key, $default = null) {
    if (!is_array($key)) {
        return is_array($array) && array_key_exists($key, $array) ? $array[$key] : $default;
    }

    if (!$key) return $default;

    foreach ($key as $k) {
        if (is_array($array) && array_key_exists($k, $array)) {
            $array = $array[$k];
        } else {
            return $default;
        }
    }

    return $array;
}
同時に、階層を調整して値を設定したい場面もありました。
setter版も作成しました。
<?php
/**
 * aget のsetter版
 *
 * 配列$arrayのキー$key(数値 or 文字 or 配列)に値$valueを代入する。
 * 配列で指定した場合、要素の順番に配列を掘っていく。
 * 値がnullであった場合、[] として扱う。
 *
 * $array['key1']['key2']['key3'] = $value は
 *
 * $pos = array('key1', 'key2', 'key3');
 * aset($array, $pos, $value); と書ける。
 *
 * 値の設定に成功した場合、trueを返す。
 */
function aset(&$array, $key, $value)
{
    if (!is_array($array)) {
        return false;
    }
    if (!is_array($key)) {
        if ($key === null) {
            $array[] = $value;
        } else {
            $array[$key] = $value;
        }
    } else {
        if (!$key) return false;
        $ref = &$array;
        foreach ($key as $k) {
            if ($k === null) {
                $ref = &$ref[];
            } else {
                $ref = &$ref[$k];
            }
        }
        $ref = $value;
        unset($ref, $array);
    }

    return true;
}
昔のソースを引っ張り出してきたので、出来は不明ですが・・・
複雑な配列構造の操作において、可読性にかなり貢献してくれた関数たちです。
PR
HOME |

忍者ブログ [PR]