2009-09-14 4 views
5

인수를 함수로 변환하려면 연관 배열 키를 매개 변수 변수 이름과 같고 값은 매개 변수 값과 같습니다.PHP 함수의 매개 변수 목록을 연관 배열로 변환하려면 어떻게해야합니까?

PHP :

function my_function($a, $b, $c) { 

    // <--- magic goes here to create the $params array 

    var_dump($params['a'] === $a); // Should result in bool(true) 
    var_dump($params['b'] === $b); // Should result in bool(true) 
    var_dump($params['c'] === $c); // Should result in bool(true) 
} 

내가 어떻게 할 수 있습니까?

+0

배열을 첫 번째 인수로 받아들이고 배열을 공급하는 초기 함수를 정의 할 수없는 이유가 있습니까? –

+1

meder : 1) 추악한 API를 제공하고, 2) 호출 소스를 변경해야합니다. 이러한 기능 중 다수가 이미 존재하며 호출되고 있습니다. – Fragsworth

+1

필자는 왜 "추한"API가 될지 모르겠다. 필자는 사전을 파이썬에서 인수로 사용하고 ECMAScript에서 객체를 공급하는 것과 같이 더 깔끔하고 비슷할 것이다. –

답변

10

다음은 compact를 사용하여이 작업을 수행 할 수 있습니다

function myFunc($a, $b, $c) { 
    $params = compact('a', 'b', 'c'); 
    // ... 
} 

또는 get_defined_vars() 당신에게 일하는 것이 그 범위에 정의 된 모든 변수의 연관 배열을 줄 것이다,하지만이 또한 $_POST를 포함 할 수 있습니다 생각, $_GET

그렇지 않으면 func_get_args을 사용하여 함수에 전달 된 모든 인수 목록을 가져올 수 있습니다. 이것은 이 아니고 associative이지만 전달 된 데이터 (즉, 변수 이름이 없음)이기 때문에 연관이 있습니다. 이것은 또한 함수에 여러 개의 인수를 가질 수있게합니다.

은 또는, 단지 배열 인 하나 개의 인수를 지정

function myFunc($params) { 

} 

compact() 당신이 생각 계신 가장 가까운 것 같다.

+0

내가 싫어하는 이유는 변수 이름을 반복해야하기 때문입니다. – Fragsworth

+1

그런 다음'get_defined_vars'를보십시오. – nickf

7

get_defined_vars()은 함수 내부에서 호출되기 전에 다른 변수가 정의되어 있지 않은 경우 필요한 것입니다 (함수 내부에서 먼저 수행함으로써이를 보장 할 수 있습니다).

function my_function($a, $b, $c) { 

    $params = get_defined_vars(); // <--- create the $params array 

    var_dump($params['a'] === $a); // results in bool(true) 
    var_dump($params['b'] === $b); // results in bool(true) 
    var_dump($params['c'] === $c); // results in bool(true) 
} 
+0

나는 이것을 수년간 사용 했어야했다. 정답. – user3751385

1

나는 nickf의 대답 @ upvoted하지만) (즉, 컴팩트도의 ctor를 사용하여 모델을 인스턴스화 할 수있는 좋은 방법입니다 것을 추가하고 싶습니다 :

class User { 
    public $email; 
    public $password; 
    public $firstName; 
    public $lastName; 

    public function __construct ($email, $password, $firstName, $lastName) 
    { 
     foreach (compact(array_keys((array)$this)) as $k => $v) 
      $this->$k = $v; 
    } 
} 

는 그냥 PARAMS이이 있는지 확인 들판과 정확히 같은 철자법.

+0

내가 찾고 있던 것이 아니라 upvote를 정당화하기위한 여전히 멋진 트릭. – user3751385

관련 문제