Есть ли функция для извлечения «столбца» из массива в PHP?

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

array(array('page' => 'page1', 'name' => 'pagename1') array('page' => 'page2', 'name' => 'pagename2') array('page' => 'page3', 'name' => 'pagename3')) 

Есть ли встроенная функция, которая вернет новый массив только с значениями ключей «name»? поэтому я бы получил:

 array('pagename1', 'pagename2', 'pagename3') 

Почему это должна быть встроенная функция? Нет, их нет, напишите сами.

Вот хороший и легкий, в отличие от других в этой теме.

 $namearray = array(); foreach ($array as $item) { $namearray[] = $item['name']; } 

Начиная с PHP 5.5 вы можете использовать array_column() :

 <?php $samples=array( array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3') ); $names = array_column($samples, 'name'); print_r($names); 

Смотрите это в действии

Вот функциональный способ сделать это:

 $data = array( array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3')); $result = array_map(create_function('$arr', 'return $arr["name"];'), $data); print_r($result); 

Хорошо. По крайней мере, для PHP> 5.5.0 и называется array_column

Функция PHP принимает необязательный параметр $index_key который, согласно веб-сайту PHP, указывает:

$index_key

Столбец для использования в качестве индекса / ключей для возвращаемого массива. Это значение может быть целым ключом столбца, или это может быть имя строкового ключа

В ответах здесь я вижу разделенную версию без необязательного параметра. Мне это было нужно, вот, вот полная функция:

 if (!function_exists('array_column')) { function array_column($array, $column, $index_key = null) { $toret = array(); foreach ($array as $key => $value) { if ($index_key === null){ $toret[] = $value[$column]; }else{ $toret[$value[$index_key]] = $value[$column]; } } return $toret; } } 

Подобно решению fuentesjrs, но немного более обобщенному, используя array_walk () с пользовательским обратным вызовом:

 // Define the callback function extract_named_sub_elements(&$item, $key, $name) { $item = $item[$name]; } // Test data $original = array( array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3'), ); // Use a copy, as array_walk() operates directly on the passed in array $copy = $original; // Substitute 'name' with whatever element you want to extract, eg 'page' array_walk($copy, 'extract_named_sub_elements', 'name'); print_r($copy); 
 if (!function_exists('array_column')) { function array_column($array,$column) { $col = array(); foreach ($array as $k => $v) { $col[]=$v[$column]; } return $col; } } 

Это должно работать для версий php <5.5 и деградировать в случае существования функции

Да, есть встроенная функция php, называемая array_column, которая делает то, что вы ищете.

Вы бы назвали его чем-то вроде $name_keys = array_column($array, 'name'); чтобы получить результат, который вы ищете.

Более подробную информацию см. В следующей статье руководства PHP:

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

Вы можете расширить класс ArrayIterator и переопределить метод mixed current(void) .

 class Foo extends ArrayIterator { protected $index; public function __construct($array, $index) { parent::__construct($array); $this->index = $index; } public function current() { $c = parent::current(); return isset($c[$this->index]) ? $c[$this->index] : null; } } $a = array( array('page' => 'page1', 'name' => 'pagename1'), array('name' => '---'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3') ); $f = new Foo($a, 'page'); foreach($f as $e) { echo $e, "\n"; } 

печать

 page1 page2 page3 

Я не думаю, что для этого нужна встроенная функция. В вашем массиве может быть массив.

 $samples=array( array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3') ); $output1=array(); $output2=array(); foreach($samples as $sample){ array_push($output1,$sample['name']); $output2[]=array_splice($sample,1); } print_r($output1); print_r($output2); 

в $ output1 это результат, который вы хотите, если хотите только удалить часть индексации страницы, а затем $ output2.

если вам нужны все значения из этого массива и численно числится массив, то вы можете использовать

 $array_1=array_values($samples); 

но я понимаю, вы этого не хотели.

Это довольно простой вызов array_reduce.

 $valuesOnly = array_reduce($modelData, function ($carry, $item) { return array_merge($carry, $item['id']); }, []); 

Я хотел бы опубликовать здесь, даже если это старый вопрос, потому что он по-прежнему очень уместен, и многие разработчики не используют PHP> = 5.5

Допустим, у вас есть такой массив:

 Array ( [files] => Array ( [name] => Array ( [0] => file 1 [1] => file 2 [2] => file 3 ) [size] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [error] => Array ( [0] => abc [1] => def [2] => ghi ) ) ) 

и вы хотите получить что-то вроде этого:

 Array ( [0] => Array ( [0] => file 1 [1] => 1 [2] => abc ) [1] => Array ( [0] => file 2 [1] => 2 [2] => def ) [2] => Array ( [0] => file 3 [1] => 3 [2] => ghi ) ) 

Вы можете просто использовать метод array_map () без имени функции, переданного в качестве первого параметра, например:

 array_map(null, $a['files']['name'], $a['files']['size'], $a['files']['error']); 

К сожалению, вы не можете сопоставлять ключи, если передаете несколько массивов.

Вы имеете в виду array_values ?

Редактировать: Спасибо за меньшее количество комментариев. Если бы кто-то успел взглянуть на документацию для функции, вы бы увидели первый комментарий, который дает пример написания вашей собственной функции array_values_recursive. Объедините это с array_walk, и у вас будет довольно элегантная функция, в которой не будет жестко закодирован столбец «name». Sheesh.

Чтобы расширить некоторые ответы здесь, начиная с PHP 5.5, array_column – это то, что вы хотите.

На самом деле это имеет несколько возможных применений.

Используя примерный массив ниже, вот несколько способов использования array_column.

 $a = array( array('id' => '1', 'name' => 'Joe'), array('id' => '2', 'name' => 'Jane') ); 

Получение одного столбца в качестве массива

 $b = array_column($a, 'name'); 

Дала бы вам. Обратите внимание на автоматические клавиши, начинающиеся с 0, в соответствии с обычным массивом.

 $b[0] = 'Joe'; $b[1] = 'Jane'; 

Получение полного массива с столбцом в качестве индекса.

 $c = array_column($a, NULL, 'id'); 

Это приведет к следующему.

 $c[1] = array('id' => '1', 'name' => 'Joe'); $c[2] = array('id' => '2', 'name' => 'Jane'); 

Обратите внимание, как столбец, который я выбрал в качестве третьего параметра, становится ключом для каждого элемента, и я получаю полный массив, устанавливая второй параметр равным нулю.

Конечно, окончательное использование – установить как второй, так и третий параметры.

 $d = array_column($a, 'name', 'id'); 

Дала бы вам следующее.

 $d[1] = 'Joe'; $d[2] = 'Jane'; 

Я лично использую полные 3 параметра для создания списков опций выбора. Если у меня есть таблица с моими параметрами, я запрашиваю таблицу и получаю результат и передаю ее в это, чтобы получить список с ключом как значение и метку. Это блестящий способ создания информационных наборов, которые также должны пересекаться по индексу.