Я ищу встроенную функцию php, которая принимает массив ключей в качестве входных данных и возвращает мне соответствующие значения.
например, у меня есть следующий массив
$arr = array("key1"=>100, "key2"=>200, "key3"=>300, 'key4'=>400);
и мне нужны значения для ключей key2 и key4, поэтому у меня есть другой array("key2", "key4")
Мне нужна функция, которая принимает этот массив и первый массив в качестве входных данных и дает мне значения в ответ. Таким образом, ответ будет array(200, 400)
Я думаю, что вы ищете 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, если вам нужен последовательный массив.
Альтернативный ответ:
$keys = array("key2", "key4"); return array_map(function($x) use ($arr) { return $arr[$x]; }, $keys);
foreach($input_arr as $key) { $output_arr[] = $mapping[$key]; }
Это приведет к $output_arr
имеющему значения, соответствующие списку ключей в $input_arr
, на основе сопоставления значений $input_arr
> в $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)
Одно из соображений, которое стоит сделать в отношении представленных решений, – это использовать array_intersect_key (), если второй аргумент имеет дублированные значения, они будут перезаписаны при передаче в array_flip (), потому что, очевидно, индексы массивов уникальны.
И это не происходит со вторым подходом, потому что нет переворота, что делает его подходящим для определенных случаев.