递归填充数组

时间:2014-11-12 22:45:42

标签: php mysql arrays recursion

我创建了一个用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;
}

这似乎不是处理我的配置的递归性质的理想方式 有没有更好的方法将这些字符串解析成数组?

1 个答案:

答案 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