Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 递归填充数组_Php_Mysql_Arrays_Recursion - Fatal编程技术网

Php 递归填充数组

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

我创建了一个用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;
}
方法如下所示:

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)
,这非常有效,我学到了很多关于引用的知识。非常感谢。