我创建了一个用MySQL行填充数组的方法,用下划线分隔每个级别。我没有在MySQL中分隔列,因为有多个客户端端点使用path
列作为参考。目前只有不超过3个下划线,但我已经允许更多。该库可以在内部引用它们(例如self::$config['api']['version']
),其中第一个键是需要它的库(例如network
)。
表格如下:
INSERT INTO `settings` (`id`, `path`, `name`, `value`, `type`, `enabled`) VALUES
(19,'network_api_twilio_price','Twilio SMS Price','0.30',7,1),
(20,'network_api_version','API Version','1.0',7,1),
(21,'network_connection','Connectivity Enabled','true',1,1);
方法如下:
public static function getConfig($key) {
self::process('site', self::select([ 'path', 'value', 'type' ], 'rms2.settings', 'path', 'LIKE', $key . '_%'), __METHOD__);
$config = [ ];
foreach (self::fetch() as $value) {
$path = explode('_', substr($value['path'], strlen($key . '_')));
$n = count($path);
if ($value['type'] === '1') {
$value['value'] = ($value['value'] === 'true' || $value['value'] === '1') ? true : false;
}
switch ($n) {
case 5:
$config[$path[0]][$path[1]][$path[2]][$path[3]][$path[4]] = $value['value'];
break;
case 4:
$config[$path[0]][$path[1]][$path[2]][$path[3]] = $value['value'];
break;
case 3:
$config[$path[0]][$path[1]][$path[2]] = $value['value'];
break;
case 2:
$config[$path[0]][$path[1]] = $value['value'];
break;
case 1:
$config[$path[0]] = $value['value'];
break;
}
}
return $config;
}
这似乎不是处理我的配置的递归性质的理想方式 有没有更好的方法将这些字符串解析成数组?
答案 0 :(得分:1)
这很棘手,但是通过使用引用,您可以迭代地执行(或者如果您设置了函数,则递归执行)
这里的关键是使用$cur = &$cur[$v];
来嵌套新密钥
$path = explode('_', substr($value['path'], strlen($key . '_')));
$array = array();
// Start nesting new keys
$cur = &$array;
foreach($path as $v){
$cur[$v] = array();
$cur = &$cur[$v];
}
// Final assignnemnt
$cur = $value['value'];
生活在ideone上:http://ideone.com/VtKqlD