2011-01-02 19 views
5

Ich habe eine Ergebnismenge als ein Array aus einer Datenbank, die wie folgt aussieht:PHP mehrdimensionales Array Manipulation Werte

array (
    0 => array (
     "a" => "something" 
     "b" => "something" 
     "c" => "something" 
    ) 
    1 => array (
     "a" => "something" 
     "b" => "something" 
     "c" => "something" 
    ) 
    2 => array (
     "a" => "something" 
     "b" => "something" 
     "c" => "something" 
    ) 
) 

Wie würde ich eine Funktion zu ersetzen, die Werte eines Arrays nur auf dem Array-Schlüssel mit b gelten ? Normalerweise würde ich einfach ein neues Array mit einer foreach-Schleife erstellen und die Funktion anwenden, wenn der Array-Schlüssel b ist, aber ich bin nicht sicher, ob es der beste Weg ist. Ich habe versucht, einen Blick auf viele Array-Funktionen zu werfen und es schien, als ob array_walk_recursive etwas ist, das ich verwenden könnte, aber ich hatte kein Glück, es zu tun, was ich wollte. Wenn ich es nicht gut genug, um zu beschreiben, im Grunde möchte ich in der Lage sein, zu tun, wie der folgende Code tut:

$arr = array(); 
foreach ($result as $key => $value) 
{ 
    foreach ($value as $key2 => $value2) 
    { 
     $arr[$key][$key2] = ($key2 == 'b' ? $this->_my_method($value2) : $value2); 
    }  
} 

Soll ich mit dem Stick, oder gibt es einen besseren Weg?

Antwort

3

Mit array_walk_recursive:

Wenn Sie PHP> = 5.3.0 (für anonymous functions):

array_walk_recursive($result, function (&$item, $key) { 
    if ($key == 'b') { 
     $item = 'the key is b!'; 
    } 
}); 

sonst so etwas wie:

function _my_method(&$item, $key) { 
    if ($key == 'b') { 
     $item = 'the key is b!'; 
    } 
} 
array_walk_recursive($result, '_my_method'); 
+0

Danke, ich hatte array_walk_recursive bereits versucht, wie ich oben sagte, aber es hat nicht funktioniert. Anscheinend habe ich vergessen, das kaufmännische Und vor dem $ item param zu platzieren! Arbeite jetzt. – Joker

+0

Yup, einfacher Fehler zu machen. Zitieren des Handbuchs: 'Wenn Funktionsname mit den tatsächlichen Werten des Arrays arbeiten muss, geben Sie den ersten Parameter von Funktionsname als Referenz an. Dann werden alle Änderungen, die an diesen Elementen vorgenommen werden, im ursprünglichen Array selbst vorgenommen. – thirtydot

0

Noch nicht getestet, aber ich denke, das wird funktionieren.

Die Funktion wird durch ein Array bewegt, das die Schlüssel für b überprüft. Wenn der Schlüssel auf ein Array zeigt, folgt er rekursiv nach unten.

+0

ist das nicht, was 'array_walk_recursive' schon macht? –

+0

@Jacob: Ich bin nicht vertraut mit der genauen Syntax von 'array_walk_recursive' und habe mich nicht darum gekümmert. Das zu tippen war schneller. –

0

Verwendung array_walk_recursive documented here

$replacer = function($x) {return "I used to be called $x";}; //put what you need here 
$replaceB = function(&$v, $k) use ($replacer) {if ($k === 'b') $v = $replacer($v);}; 

array_walk_recursive($arr, $replaceB); 

Die replacer Funktion könnte übertrieben sein. Sie können es durch ein Literal oder irgendetwas, das Sie mögen, ersetzen.

+0

Ich bin mir nicht sicher, warum jemand entschieden hat, Ihre Antwort zu verwerfen - es hat für mich funktioniert. Ich würde jedoch empfehlen, es aufzuräumen, dh zu erwähnen, dass der Schlüssel darin besteht, $ v als Referenz zu übergeben und den Code zu ändern, um die Anfangs- und Endwerte zu drucken und natürlich leichter zu lesen (keine unnötigen Lambda-Funktionen oder zusätzliche Logik wie) '$ k == 'b''). –