Php 递归填充数组
我创建了一个用MySQL行填充数组的方法,用下划线分隔每个级别。我没有在MySQL中分隔列,因为有多个客户端端点使用Php 递归填充数组,php,mysql,arrays,recursion,Php,Mysql,Arrays,Recursion,我创建了一个用MySQL行填充数组的方法,用下划线分隔每个级别。我没有在MySQL中分隔列,因为有多个客户端端点使用path列作为参考。目前没有超过3个下划线,但我已经考虑了更多。库可以在内部引用它们(例如self::$config['api']['version']),其中第一个键是需要它的库(例如network) 该表如下所示: INSERT INTO `settings` (`id`, `path`, `name`, `value`, `type`, `enabled`) VALUES
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;
}
方法如下所示:
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;
}
这似乎不是处理我的配置的递归性质的理想方法。是否有更好的方法将这些字符串解析为数组?这很棘手,但通过使用引用,您可以迭代地(或递归地,如果您设置了函数)
这里的关键是使用
$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上生活:由于我对通过引用传递和覆盖的知识缺乏,我感到有点沮丧,最后我使用了if(!isset($cur[$v]){$cur[$v]=[];}
和数组合并递归($config,$array)
,这非常有效,我学到了很多关于引用的知识。非常感谢。