각 행을 밑줄로 분리하여 배열을 MySQL 행으로 채우는 메소드를 만들었습니다. path
컬럼을 참조로 사용하는 클라이언트 엔드 포인트가 여러 개 있기 때문에 MySQL의 컬럼을 분리하지 않았습니다. 현재로서는 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;
}
이 내 설정의 재귀 적 성격을 처리 할 수있는 이상적인 방법이 될 것 같지 않습니다.
이러한 문자열을 구문 분석하여 더 나은 방법이 있습니까?
참조로 통과하고 덮어 쓰는 것에 대한 지식이 부족하여 좌절감이 생겨서 결국 if (! isset ($ cur [$ v])) {$ cur [$ v] = []; }'와'array_merge_recursive ($ config, $ array)'와 같이,이 작업은 아름답게 진행되었고, 참고 문헌을 많이 배웠다. 고맙습니다! –