2012-03-28 5 views
0

Ziemlich einfach; Ich bin nur neugierig, ob es einen besseren Weg gibt, dies zu erreichen.Multidimensionales Array zu Schlüssel/Wert-Wörterbuch; aus der Funktion zurückgegeben, keine Kontrollstrukturen

ein Array wie folgt gegeben:
(das Ergebnis mit preg_match_all()PREG_SET_ORDER)

$matches = array(2) { 
    [0]=> 
    array(5) { 
    [0]=> 
    string(8) "key=foo;" 
    ["key"]=> 
    string(3) "key" 
    [1]=> 
    string(3) "key" 
    ["value"]=> 
    string(3) "foo" 
    [2]=> 
    string(3) "foo" 
    } 
    [1]=> 
    array(5) { 
    [0]=> 
    string(12) "pattern=bar;" 
    ["key"]=> 
    string(7) "pattern" 
    [1]=> 
    string(7) "pattern" 
    ["value"]=> 
    string(3) "bar" 
    [2]=> 
    string(3) "bar" 
    } 
} 

Ich möchte in ein Array extrahieren, die folgenden:

array(2) { 
    ["key"]=> 
    string(3) "foo" 
    ["pattern"]=> 
    string(3) "bar" 
} 

Im Wesentlichen ein assoziatives Array von $array[$i]['key'] => $array[$i]['value'] für jede $i.
(Wenn das verwirrend klingt, sorry, es ist spät)

Wie auch immer, dies ist trivial; jedoch versuche ich dies mit PHP-Kern array_* Funktionen zu erreichen, die zurückgeben das resultierende Array (Entschuldigung array_walk).

Nein foreach oder andere Schleifenkontrollstrukturen.

Im Moment habe ich es bekommen habe, um diese nach unten:

\array_combine(\array_map(function($match) { 
     return (string) $match['key']; 
    }, $matches), \array_map(function($match) { 
     return (string) $match['value']; 
    }, $matches)) 

Welche funktioniert, aber es ist nicht genau das prägnante; Ich mag es nicht, array_map zweimal - einmal für Schlüssel, einmal für Werte.

Gibt es eine weitere elegante Lösung, um verschachtelte Werte aus einem wohlgeformten mehrdimensionalen Array in ein eindimensionales Schlüssel/Wert-Paar-Wörterbuch zu extrahieren?

+1

'$ a = []; array_walk (Funktion ($ m) {$ a [$ m ['Schlüssel']] = $ m ['Wert'];}, $ entspricht); ' – kirilloid

+0

@kirilloid So nah; Ich habe vergessen zu erwähnen, dass 'array_walk' aus ist, weil es' bool' anstelle des resultierenden Arrays zurückgibt. Dieser Aufruf wird als Argument an eine andere Funktion übergeben und das resultierende Array sollte übergeben werden. Danke aber! – Dan

+0

Sie können diesen Anruf in eine andere Funktion umbrechen. Und ich fürchte, es gibt keine kürzere Lösung mit so begrenzten Funktionen * erlaubt *. – kirilloid

Antwort

2

mit PHP v5.3 +:

wegen:

5.3.0 geänderter anfänglicher ermöglichen gemischt, die zuvor ganze Zahl ist.

http://php.net/manual/en/function.array-reduce.php

$matches = array(
    array(
       'key=foo;', 
    'key' => 'key', 
       'key', 
    'value' => 'foo', 
       'foo', 
), 
    array(
       'pattern=bar;', 
    'key' => 'pattern', 
       'pattern', 
    'value' => 'bar', 
       'bar', 
), 
); 

$a = array_reduce($matches, function ($b, $v) { 
    return $b + array($v['key'] => $v['value']); 
}, array()); 

print_r($a); 

/* 
Array 
(
    [key] => foo 
    [pattern] => bar 
) 
*/ 
+0

Dank @Yoshi - Einfach und elegant; Punkt auf :) – Dan