我想通过使用分隔字符串来访问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;
}
如何清理此功能并删除硬编码的“深度”限制?
答案 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
中可能是明智的。