2011-01-30 2 views
1

배열 키의 값을 찾기 위해 "무제한"양의 인수 (func_get_args() 사용)를 허용하는 함수를 만들려고합니다 (이미 존재하지 않는 한?). 어레이 내부의 깊이에 상관없이 찾을 수 있습니다. 나는이 $this->properties['settings']['template']['default']의 값을 얻을 수 있겠 $registry->getSetting('template', 'default');을 사용하는 경우함수 인수를 사용하여 더 깊은 배열 키 액세스

는 말 또는 당신이 $registry->getSetting('users', 1, 'name', 'first'); 내가 기대한다면 그것은 (추가 인수 부부와 함께 단지 두 번째 예) $this->properties['users'][1]['name']['first']의 값을 반환 할 수 있습니다.

이제 이와 같은 작업을 수행하기 위해 전달 된 인수의 수를 func_num_args()을 사용하여 계산 한 다음 다른 경우로 전환합니다. 그렇다고해서 일정량의 키로 제한됩니다.

배열의 더 깊은 키에 액세스하기 위해 일정량의 인수가 아닌 "무제한"양을 허용하기 위해이 방법이 있는지 묻습니다.

<?PHP 
class Registry 
{ 
    // Values are actually fetched from a config file, but for easier understanding 
    private $properties = array(
     'settings' => array(
      'template' => array(
       'default' => 'default', 
       'caching' => TRUE 
      ) 
     ) 
    ); 

    public function getSetting() 
    { 
     // do something like 
     // return $this->properties['settings'][func_get_args()]; 
    } 
} 
?> 

무엇이든 도움을 주시면 감사하겠습니다.
감사합니다.

답변

2
<?PHP 
class Registry 
{ 
    // Values are actually fetched from a config file, but for easier understanding 
    private $properties = array(
     'settings' => array(
      'template' => array(
       'default' => 'default', 
       'caching' => TRUE 
      ) 
     ) 
    ); 

    public function getSetting() 
    { 
     $result = $this->properties; 

     foreach (func_get_args() as $arg) { 
      if (isset($result[$arg])) { 
       $result = $result[$arg]; 
      } else { 
       return; 
      } 
     } 

     return $result; 
    } 
} 

$r = new Registry(); 

var_dump($r->getSetting('settings', 'template', 'default')); 

?> 
+0

이것은 그것을하는 것처럼 보였습니다, 대단히 감사합니다! – eklundchristopher

1

흠, 나는 이것이 당신이 원하는 경우에 확실하지 않다, 그러나 이것은 PHP 매뉴얼에서 직선 :

가변 인자 목록 4 이상이있다

PHP 사용자 정의 함수에 가변 길이 인수 목록을 지원합니다. 이것은 func_num_args(), func_get_arg() 및 func_get_args() 함수를 사용하여 실제로는 매우 입니다.

특수 구문은 필요하지 않으며 인수 목록은 함수 정의와 함께 제공되는 을 명시 적으로 명시 적으로 가질 수 있으며 은 정상적으로 동작합니다.

나는 하나의 배열에 인수 및 출력을 통해 단지 루프 (나는 당신의 질문 잘못 해석 될 수있다) 것

:

$output = array(); 
$arguments = func_get_args(); 

foreach ($argument as $arg) 
{ 
    $output[$arg] = $this->properties['settings'][$arg]; 
} 

return $output; 

행운을 빕니다? 중첩 된 배열 구분자로

+0

네, 정말 고마워요. 그러나 그가 처음이었던 것에 따라 나는 zerkms 지위를 받아 들일 것이다, 다시 한번 당신에게 감사해라! – eklundchristopher

+0

그의 대답이 더 좋았다고 생각합니다. 광산은 최고 수준의 설정을 뱉어 낸다 ... – Blender

0

사용 점 :

Registry::getAttribute('first.second.1.value'); // will return $ar['first']['second'][1]['value'] 

의 getAttribute에서 .에 의해 PARAM 폭발 및 레지스트리 값으로 매핑.

+0

이것은 동일한 문제로 나를 떠날 것이지만, 이미 해결되었다. 어쨌든 고마워! – eklundchristopher

1

가이 작업을 수행 할 수있는 PHP 함수이지만, 내 방식대로 잘 너무 작동하는지 그나마 알고

class Registry 
{ 
    // Values are actually fetched from a config file, but for easier understanding 
    private $properties = array(
     'settings' => array(
      'template' => array(
       'default' => 'default', 
       'caching' => TRUE 
      ) 
     ) 
    ); 

    public function getSetting($array = array()) 
    { 
     $return = $this->properties['settings']; 
     foreach($array as $a) 
     { 
      $return = $return[$a]; 
     } 
     return $return; 
    } 
} 

는 사용하는 데 도움이

$Registry = new Registry(); 
$template = $Registry->getSetting(array('template')); 
$template_caching = $Registry->getSetting(array('template', 'caching')); 

희망 : D를

+0

고맙습니다, 이미 해결되었지만 감사합니다 – eklundchristopher

0

이와 비슷한 것 (시험 안 함) :

function getSetting (/* .. */) 
{ 
    $args = func_get_args(); 
    array_unshift($args, $this->properties); 

    return getSettingInternal($args); 
} 

function getSettingInternal ($args) 
{ 
    $arr = $args[0]; 
    if (count($args) > 1) 
    { 
     $key = array_slice($args, 1, 1); 
     if (!is_array($arr)) 
      return $arr; 

     $arr = array_key_exists($arr, $key) ? $arr[$key] : $arr['default']; 
     $args[0] = $arr; 
     return getSettingInternal($args); 
    } 
    else 
     return $arr; 
} 
+0

와우, 너무 느려요;) – poke

관련 문제