2009-09-14 1 views
5

Ich möchte die Argumente in eine Funktion in ein assoziatives Array mit Schlüsseln konvertieren, die den Namen der Parametervariablen und den Werten entsprechen, die den Parameterwerten entsprechen.Wie kann ich die Parameterliste einer PHP-Funktion in ein assoziatives Array konvertieren?

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

Wie kann ich das tun?

+0

Gibt es einen Grund, warum Sie nicht einfach die Anfangsfunktion definieren können, um ein Array als erstes Argument zu akzeptieren und ein Array zu füttern? –

+1

Meder: Das würde 1) eine hässliche API bereitstellen, und 2) eine Menge Änderungen an der Anrufquelle erfordern. Viele dieser Funktionen existieren bereits und werden aufgerufen. – Fragsworth

+1

Ich sehe nicht wirklich, warum es eine "hässliche" API wäre - für mich wäre es sauberer und ähnlicher als das Füttern von Wörterbüchern als Argumente in Python und das Füttern von Objekten in ECMAScript. –

Antwort

10

Die Sie diese compact verwenden können:

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

Oder get_defined_vars() geben Ihnen ein assoziatives Array aller Variablen in diesem Bereich definiert, die funktionieren würde, aber ich denke, das ist auch $_POST umfassen könnte, $_GET, etc ...

Andernfalls können Sie func_get_args verwenden, um eine Liste aller an die Funktion übergebenen Argumente zu erhalten. Dies ist nicht assoziativ obwohl, da nur Daten übergeben werden (das heißt, es gibt keine Variablennamen). Dadurch können Sie auch eine beliebige Anzahl von Argumenten in Ihrer Funktion haben.

Oder nur ein Argument angeben, die ein Array ist:

function myFunc($params) { 

} 

compact() scheint am nächsten zu sein, was Sie nach though.

+0

Der Grund, warum ich das nicht mag, ist, dass die Variablennamen wiederholt werden müssen. – Fragsworth

+1

schauen Sie sich 'get_defined_vars' dann an. – nickf

7

get_defined_vars() ist, was Sie brauchen, wenn keine anderen vars definiert sind, bevor sie innerhalb der Funktion aufgerufen werden (Sie können dies sicherstellen, indem Sie es als erstes in der Funktion machen).

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

Ich sollte das seit Jahren verwenden. Die richtige Antwort. – user3751385

1

I upvoted @ Antwort des Nickf möchte aber hinzufügen, dass das compact() ist auch eine gute Möglichkeit, ein Modell mit einem Ctor zu instanziiert:

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

So stellen Sie sicher, dass die params haben die genau die gleiche Schreibweise wie die Felder.

+0

Nicht das, wonach ich suchte - aber immer noch ein cooler Trick, um eine Aufwertung zu rechtfertigen. – user3751385

Verwandte Themen