用于访问assoc数组的分隔字符串

时间:2014-02-19 13:42:46

标签: php explode

我想通过使用分隔字符串来访问assoc数组。

Configuration::get('enviroment/database/default');

以下是我拥有的,有效的,但它远非完美。

public static function get($key) {
    $array = explode('/', $key);
    switch(count($array)) {
        case 1:
            $value = self::$cfg[$array[0]];
            break;
        case 2:
            $value = self::$cfg[$array[0]][$array[1]];
            break;
        case 3:
            $value = self::$cfg[$array[0]][$array[1]][$array[2]];
            break;
    }
    return $value;
}

如何清理此功能并删除硬编码的“深度”限制?

2 个答案:

答案 0 :(得分:1)

public static function get($path) {
    $result = self::$cfg;

    foreach (explode('/', $path) as $key) {
        if (!array_key_exists($key, $result)) {
            throw new InvalidArgumentException("Path $path is invalid");
        }
        $result = $result[$key];
    }

    return $result;
}
顺便说一下,使用静态类通常不是一个好主意,你应该实例化它。请参阅How Not To Kill Your Testability Using Statics

答案 1 :(得分:1)

您可以使用foreach()循环,然后将该值分配给将保留self::$cfg的变量的键:

$confArr = self::$cfg;

foreach(explode('/', $key) as $cfg)
{
    $confArr = $confArr[$cfg];
}

return $confArr;

请注意,添加一些错误检查以使密钥存在于self::$cfg中可能是明智的。