2014-11-12 3 views
1

각 행을 밑줄로 분리하여 배열을 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; 
} 

이 내 설정의 재귀 적 성격을 처리 할 수있는 이상적인 방법이 될 것 같지 않습니다.
이러한 문자열을 구문 분석하여 더 나은 방법이 있습니까?

답변

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']; 

라이브에게 그것을 할 수 있습니다 이데 오네에 : http://ideone.com/VtKqlD

+0

참조로 통과하고 덮어 쓰는 것에 대한 지식이 부족하여 좌절감이 생겨서 결국 if (! isset ($ cur [$ v])) {$ cur [$ v] = []; }'와'array_merge_recursive ($ config, $ array)'와 같이,이 작업은 아름답게 진행되었고, 참고 문헌을 많이 배웠다. 고맙습니다! –

관련 문제