2011-01-28 6 views
0

명명 된 매개 변수는 PHP 사용자 정의 함수 또는 클래스의 긴 옵션 목록에 유용합니다. 하지만 중첩 된 옵션은 무엇입니까?PHP의 중첩 된 명명 된 매개 변수

예는 :

function foobar($foo,$bar,$options=array()) { 

    $default_options = array('option1'=>'','option2'=>'hello','option3'=>array('option1'=>true,'option2'=>'')); 

    $options = array_merge($default_options,(array)$options); 
} 

그래서 옵션 3은 서브 옵션과 다른 배열입니다. 서브 옵션을 병합하기 위해 for 루프에 넣어야합니까? 이 사건에서 너는 무엇을 할 것인가? $ 옵션에 대한

foobar('foo','bar',array('option1'=>'foo','option3'=>array('option1'=>false))); 

종료 구조 :

편집 :

이 함수 호출이

array(
'option1'=>'foo', 
'option2'=>'hello', 
'option3'=>array(
    'option1'=>false, 
    'option2'=>'' 
); 
+0

array_merge (array1, array2)를 확인하십시오. – powtac

+0

네,하지만 이미 그렇게하고 있습니다 : $ options = array_merge ($ default_options, (array) $ options); – DADU

+0

다른 옵션은 모든 중첩 된 옵션 배열을 추가 매개 변수로 추가하는 것입니다. 중첩 배열이나 위치 매개 변수가되는 추가 매개 변수 중 하나를 선택하기가 어렵습니다. – DADU

답변

1

왜뿐만 아니라 func_get_args 기능을 사용 : 여기

실제로 array_merge()처럼 동작 재귀 버전 또는 array_merge()입니까?

function yourFunction($keys) { 
    $default_options = array('test', array('test1' => array('test2')), 'test3'); 
    $options = func_get_args(); 
    array_shift($options); 

    $options = array_combine($keys, $options); 
    $options = array_merge($default_options, $options); 

    print_r($options); 
} 

// Usage 
yourFunction(array('option1', 'option2', 'option3', 'option4'), 'optionval1', array('optionval2-1', 'optionval2-2'), 'optionval3', 4); 

이 방법을 사용하면 처음부터 배열 할 수 있으므로 걱정할 필요가 없습니다. 매개 변수/인수를 여러 개 사용할 수 있습니다!

EDIT :

여기서 출력 함수 위 수정 (제 편집, 제 PARAM로 $ 키를 추가). 정확히 어떤 형식의 출력을 찾고 있는지 확실하지 않습니다. 따라서 주어진 초기 데이터에 대해 끝나는 배열 구조를 게시해야 할 수도 있습니다. 나는 CakePHP framework에서 발견 한 것을

Array 
(
    [0] => test 
    [1] => Array 
     (
      [test1] => Array 
       (
        [0] => test2 
       ) 

     ) 

    [2] => test3 
    [option1] => optionval1 
    [option2] => Array 
     (
      [0] => optionval2-1 
      [1] => optionval2-2 
     ) 

    [option3] => optionval3 
    [option4] => 4 
) 
+0

첫 번째 단계에서는 좋지만 기본값과 병합하면 어떨까요? – DADU

+0

위대한 출력을 추가했습니다.명명 된 매개 변수에는 명명 된 키가 있어야하기 때문에 번호가 매겨진 키를 사용하는 것은 의미가 없습니다. – DADU

+0

...에서 명명 된 매개 변수는 어디에 있습니까? "option1"등은 반드시 값이 아니라 반드시 이름이 아니 었습니다. 첫 번째 매개 변수로 항상 "keys"배열을 전달한 다음, 그것을 꺼두고 원하는 경우'array_combine'을 사용할 수 있습니다. 해당 시나리오로 업데이트 중입니다. –

1

사용 array_merge_recursive(). 이것은 하위 배열을 병합합니다.

+1

이 함수는 처음에 기대할 수있는 것을하지 않습니다. 두 배열에 키가 있으면이 함수는 두 값이 모두 들어있는 배열을 반환합니다. (실제로 ['array_merge'] (http://php.net/array_merge)처럼 행동하지 않습니다.) – arnaud576875

+0

나는 그 기능을 사용하지 않았으며, PHP가 수십억 달러를 가지고있을 것이라고 추측했습니다. 실제로 필요하지 않은 기능들. 어쨌든 xD를 알면 좋습니다. –

2

array_merge_recursive()이 있지만 실제로 예상 한대로 작동하지 않을 수 있습니다.

function array_merge_recursive_2($a, $b) { 
     foreach($b as $key => $value) { 
       if (isset($a[$key]) && is_array($a[$key]) && is_array($value)) { 
         $a[$key] = array_merge_recursive_2($a[$key], $value); 
       } else { 
         $a[$key] = $value; 
       } 
     } 
     return $a; 
} 
0

봐는 :

function merge($arr1, $arr2 = null) { 

    $args = func_get_args(); 

    $r = (array)current($args); 

    while (($arg = next($args)) !== false) { 
     foreach ((array)$arg as $key => $val) { 
      if (is_array($val) && isset($r[$key]) && is_array($r[$key])) { 
       $r[$key] = merge($r[$key], $val); 
      } elseif (is_int($key)) { 
       $r[] = $val; 
      } else { 
       $r[$key] = $val; 
      } 
     } 
    } 


    return $r; 
} 

그것은 PHP 병합 기능에 내장 된 우리를 위해이 작업을 수행 할 수없는 수치 그러나 이것은 훌륭한 대안이다.

관련 문제