2010-11-21 4 views
47

Я ищу встроенную функцию php, которая принимает массив ключей в качестве входных данных и возвращает мне соответствующие значения.Получить значения массива по ключам

, например. У меня есть следующий массив

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

и мне нужно значения для ключей key2 и Key4 так у меня есть еще один array("key2", "key4") мне нужна функция, которая принимает этот массив и первый массив в качестве входов и предоставить мне значения в ответ. Таким образом, ответ будет array(200, 400)

+1

Я не понимаю, именно то, что вы просите. Можете ли вы пояснить, может быть, с примером ввода и вывода? – BudgieInWA

ответ

94

Я думаю, что вы ищете array_intersect_key. Пример:

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

вернуться бы:

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

Вы можете использовать array('a' => '', 'c' => '') вместо array_flip(...), если вы хотите иметь немного более простой код.

Обратите внимание, что ключи массива сохранены. Затем вам следует использовать array_values, если вам нужен последовательный массив.

+0

отличный ответ, есть ли более короткий путь? –

+0

Не думайте так. Вы можете написать массив ('a' => '', 'c' => '') вместо array_flip (...), но для меня это похоже на другую семантику. – Andrew

+2

Обратите внимание, что это возвращает ассоциативный массив (поэтому в примере OP он не будет возвращать 'array (200,400)', а вместо этого 'array ('key2' => 200, 'key4' => 400)'. – Amber

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

Это приведет к $output_arr, имеющим значения, соответствующие список ключей в $input_arr, на основе Key-> отображения значений в $mapping. Если вы хотите, вы можете обернуть его в функции:

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

Тогда вы бы просто назвать его так:

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

одно соображение, что стоит быть сделаны относительно представленных решений является использование array_intersect_key (), если второй аргумент имеет дублированные значения, они будут перезаписаны при передаче в array_flip(), потому что, очевидно, индексы массива уникальны.

И это не происходит со вторым подходом, потому что нет переворачивания, что делает его подходящим для определенных случаев.

+0

+1 Во второй раз ваше объяснение –

13

Альтернативный ответ:

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

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

Приятный! Я использовал ваш метод и завернул его в функцию. –

+0

Мне это нравится, потому что это намного проще понять для меня. – racl101

Смежные вопросы