2012-07-23 8 views
5

PHP hat einige großartige Funktionen (wie array_walk), mit denen Sie jedes Element in einem Array verarbeiten können. Sie sind in der Regel so eingerichtet, dass Sie das Array angeben, das als erster Parameter verarbeitet werden soll, und eine Rückruffunktion, die auf jedes Element als zweites angewendet wird. Diese Funktionen geben boolesche Werte zurück, die auf Erfolg hinweisen, nicht wie erwartet eine Kopie des geänderten Arrays. Wenn das Array geändert werden soll, muss das Array wie folgt übergeben werden: array_walk(&$my_array, 'my_callback');Verwenden von Funktionen wie array_walk (und ähnliche Funktionen) zum Ändern von Arrays in PHP> = 5.3

Wenn Sie jedoch in PHP 5.3 und höher als Verweis auf Funktionsaufruf übergeben werden, erhalten Sie einen Fehler E_DEPRECATED.

Kennt jemand (wenn vorhanden) einen korrekten Weg, diese Funktionen zu verwenden, um Arrays zu modifizieren, ohne die Fehler auszulösen und sie nicht explizit zu unterdrücken? Gibt es neuere Alternativen zu diesen alten Array-Verarbeitungsfunktionen?

Antwort

7

Werte als Referenz übergeben werden implizit in PHP> = 5,3, wie durch die Funktionsdefinition bestimmt.

Funktionsdefinition für array_walk():

bool array_walk (array &$array , callable $funcname [, mixed $userdata = NULL ]) 

Hinweis &$array. Daher müssen Sie das Array im Funktionsaufruf in PHP> = 5.3 nicht explizit durch Referenz übergeben.

array_walk($my_array, 'my_callback'); 

Allerdings müssen Sie sicherstellen, dass die Rückruf akzeptiert es Wert ist durch Bezugnahme entsprechend (wie durch NickB demonstriert).

Werfen Sie auch einen Blick auf PHP 5.4 Call-time pass-by-reference - Easy fix available?

+0

Ah ... Danke, macht Sinn. Interessante Nuance - Sie können nicht per Referenz aufrufen, aber Sie können eine Funktion/Methode mit Argumenten definieren, auf die verwiesen wird. http://php.net/manual/en/language.references.pass.php Ich wünsche immer noch, dass diese Funktionen Kopien von modifizierten Arrays oder null statt booleans zurückgegeben! – Ray

+0

Ja, genau. Freut mich zu helfen. –

6

Weil Sie den Callback definieren sollten, um seinen Parameter durch Referenz zu akzeptieren, um das Array zu ändern.

array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 

So ein kurzes Beispiel wie folgt aus:

$my_array = range(2, 10, 2); 
array_walk($my_array, function(&$el, $key) { $el = $el/2; }); 
var_dump($my_array); 

Will output:

array(5) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    [3]=> 
    int(4) 
    [4]=> 
    int(5) 
} 
+0

Danke für das Feedback, aber Jasons beantworten, unter dem auf Ihre gemacht die Referenz Ausgabe hinzugefügt klarer. Du hast aber immer noch eine Verbesserung von mir! – Ray

+0

+1 von mir auch für das Beispiel. –

Verwandte Themen