2010-11-21 19 views
47

Ich suche nach einer eingebauten PHP-Funktion, die Array von Schlüsseln als Eingabe nimmt und mir entsprechende Werte zurückgibt.Get Array-Werte durch Schlüssel

für z.B. Ich habe folgende Array

$arr = array("key1"=>100, "key2"=>200, "key3"=>300, 'key4'=>400); 

und ich brauche Werte für die Schlüssel key2 und key4 so ein weiteres Ich habe array("key2", "key4") Ich muss eine Funktion, die diese Anordnung und dem ersten Array als Eingaben nimmt und bieten mir Werte in Antwort. So wird die Antwort sein array(200, 400)

+1

Ich verstehe nicht genau, was Sie fordern. Können Sie das verdeutlichen, vielleicht mit einem Beispiel Eingabe und Ausgabe? – BudgieInWA

Antwort

94

Ich denke, Sie suchen nach array_intersect_key. Beispiel:

array_intersect_key(array('a' => 1, 'b' => 3, 'c' => 5), 
        array_flip(array('a', 'c'))); 

Würde zurück:

array('a' => 1, 'c' => 5); 

Sie array('a' => '', 'c' => '') statt array_flip(...) verwenden können, wenn Sie ein wenig einfacher Code haben wollen.

Beachten Sie, dass die Array-Schlüssel beibehalten werden. Sie sollten danach array_values verwenden, wenn Sie ein sequenzielles Array benötigen.

+0

gute Antwort, gibt es einen kürzeren Weg? –

+0

Denke nicht. Sie können Array ('a' => '', 'c' => '') anstelle von array_flip (...) schreiben, aber es scheint für mich eine andere Bedeutung zu haben. – Andrew

+2

Beachten Sie, dass dies ein assoziatives Array zurückgibt (im Beispiel des OP würde es also nicht 'array (200,400)' zurückgeben, sondern stattdessen 'array ('key2' => 200, 'key4' => 400)'. – Amber

4
foreach($input_arr as $key) { 
    $output_arr[] = $mapping[$key]; 
} 

Dies wird in $output_arr führen die Werte mit einer Liste von Schlüsseln in $input_arr, bezogen auf die Key-> Wert Mapping in $mapping entspricht. Wenn Sie möchten, können Sie es in einer Funktion wickeln:

function get_values_for_keys($mapping, $keys) { 
    foreach($keys as $key) { 
     $output_arr[] = $mapping[$key]; 
    } 
    return $output_arr; 
} 

Dann würden Sie es einfach anrufen etwa so:

$a = array('a' => 1, 'b' => 2, 'c' => 3); 
$values = get_values_for_keys($a, array('a', 'c')); 
// $values is now array(1, 3) 
4

Eine Überlegung, dass im Wert von rund präsentierten Lösungen hergestellt werden soll durch array_intersect_key mit (), wenn das zweite Argument duplizierte Werte hat, werden sie bei der Übergabe an array_flip() überschrieben, da Array-Indizes eindeutig sind.

Und dies passiert nicht mit dem zweiten Ansatz, weil es keine Spiegelung gibt, so dass es für bestimmte Fälle geeignet ist.

+0

+1 Ich bin deine Erklärung –

13

Eine alternative Antwort:

$keys = array("key2", "key4"); 

return array_map(function($x) use ($arr) { return $arr[$x]; }, $keys); 
+0

Nice one! Ich habe Ihre Methode verwendet und es in eine Funktion verpackt. –

+0

Ich mag das, weil es für mich viel einfacher zu verstehen ist. – racl101