Как я могу создать массив из значений ключа другого массива?

У меня есть следующий массив:

$arr1 = array(
  0 => array(
    'name' => 'tom',
    'age' => 22
  ),
  1 => array(
    'name' => 'nick',
    'age' => 18
  )
);

Однако я хочу создать из него массив, состоящий из всех имен, чтобы он стал:

$arr2 = array('tom', 'nick');

Я посмотрел на array_filter(), но это не сработало, так как это многомерный массив!

Вопрос

Как создать массив со значениями определенного ключа (name) из другого многомерного массива?


person newbtophp    schedule 29.12.2010    source источник


Ответы (3)


Более новые версии PHP позволяют использовать array_map() с выражением функции вместо имени функции:

$arr2 = array_map(function($person) {
    return $person['name'];
}, $arr1);

Но если вы используете PHP ‹ 5.3, гораздо проще использовать простой цикл, так как array_map() потребуется определить (возможно, глобальную) функцию для этой простой операции.

$arr2 = array();

foreach ($arr1 as $person) {
    $arr2[] = $person['name'];
}

// $arr2 now contains all names
person jwueller    schedule 29.12.2010
comment
По-прежнему эффективнее создать глобальную функцию, чем сложный цикл. - person Christian; 29.12.2010
comment
@Christian Sciberras: Верно, но это загрязняет пространство имен ненужными микрофункциями. Цикл здесь не такой сложный. Это довольно простая итерация (при условии, что исходный массив не содержит большого количества данных). - person jwueller; 29.12.2010
comment
На самом деле, для ..каждого быстрее. Проверил, вроде в 2-3 раза быстрее. Хотя не могу сказать почему.... - person Ioannis Karadimas; 29.12.2010
comment
как array_map, так и foreach() имеют значение O(n), но вызов array_map должен создавать функцию и вызывать ее для достижения элемента в массиве в дополнение к фактической итерации. Цикл foreach() не требует дополнительных функций, поэтому он работает быстрее. array_map действительно следует использовать только в том случае, если вы делаете что-то сложное с каждым элементом в массиве. Это избыточно для этой конкретной проблемы. - person Nathan Strong; 29.12.2010
comment
Натан прекрасно описывает это, точно по той же причине, по которой я сказал сложный цикл (что здесь не так). +1 - person Christian; 31.12.2010

Это можно сделать еще более простым способом, используя array_column.

$arr2= array_column($arr1, 'name');

print_r($arr2); //Array ( [0] => tom [1] => nick )

array_column используется для получения столбцов подмассива.

person JVT    schedule 09.10.2015

если вы используете Laravel, просто используйте array_pluck:

$arr2 = array_pluck($arr1 , 'name');
person Usama    schedule 24.03.2019
comment
Это не похоже на стандартную функцию PHP. Вместо этого можно использовать array_column. - person Luke Wenke; 04.06.2019
comment
Спасибо за заметку. Я использую array_pluck в Laravel. Я обновил свой ответ. - person Usama; 19.06.2019