2009-09-14 9 views
5

Chcę przekonwertować argumenty na funkcję na tablicę asocjacyjną za pomocą klawiszy równych nazwom parametrów parametrów i wartości równej wartości parametrów.Jak mogę przekonwertować listę parametrów funkcji PHP na tablicę asocjacyjną?

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) 
} 

Jak mogę to zrobić?

+0

Czy istnieje powód, dla którego nie można po prostu zdefiniować funkcji początkowej, aby zaakceptować tablicę jako pierwszy argument i podać tablicę? –

+1

meder: To 1) zapewni brzydkie API i 2) wymaga wielu zmian w źródle wywołującym. Wiele z tych funkcji już istnieje i są one wywoływane. – Fragsworth

+1

Naprawdę nie widzę powodu, dla którego byłoby to "brzydkie" API - dla mnie byłoby czystsze i podobne do karmienia słowników jako argumentów w Pythonie i karmienia obiektów w ECMAScript. –

Odpowiedz

10

można to zrobić za pomocą compact:

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

Albo get_defined_vars() daje tablicę asocjacyjną wszystkich zmiennych zdefiniowanych w tym zakresie, która będzie działać, ale myślę, że to może również zawierać $_POST, $_GET, itp ...

W przeciwnym razie można użyć func_get_args, aby uzyskać listę wszystkich argumentów przekazanych do funkcji. Jest to jednak asocjacyjne, ponieważ są to tylko dane, które są przekazywane (czyli nie ma nazw zmiennych). Pozwala to również na uzyskanie dowolnej liczby argumentów w funkcji.

Albo, po prostu podać jeden argument, który jest tablicą:

function myFunc($params) { 

} 

compact() wydaje się być najbliżej tego, co jesteś po mimo.

+0

Powodem, dla którego nie podoba mi się to jest to, że nazwy zmiennych muszą zostać powtórzone. – Fragsworth

+1

spójrz na 'get_defined_vars', a następnie. – nickf

7

get_defined_vars() jest tym, czego potrzebujesz, jeśli nie zdefiniujesz innych zmiennych, zanim zostanie wywołany w funkcji (możesz to zapewnić, robiąc to jako pierwszą czynność wykonywaną wewnątrz funkcji).

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

Powinienem był używać tego przez lata. Poprawna odpowiedź. – user3751385

1

I upvoted @ odpowiedź nickf, ale chciałbym dodać, że kompaktowy() jest także świetnym sposobem na instancję model używając konstruktor:

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; 
    } 
} 

Wystarczy upewnić się, że params mają dokładnie taką samą pisownię, jak pola.

+0

Nie to, czego szukałem - ale wciąż jest to wystarczająco fajna sztuczka, by uzasadnić przegraną. – user3751385

Powiązane problemy