Нарезка многомерного массива PHP через один из его элементов

Скажем, например, вы просто запросили базу данных, и вы получили этот 2D-массив.

$results = array( array('id' => 1, 'name' => 'red' , 'spin' => 1), array('id' => 2, 'name' => 'green', 'spin' => -1), array('id' => 3, 'name' => 'blue' , 'spin' => .5) ); 

Я часто нахожу, что пишу петли вроде этого.

 foreach($results as $result) $names[] = $result['name']; 

Мои вопросы: существует ли способ получить этот массив $ names без использования цикла? Использование функций обратного вызова считается с использованием цикла.

Вот более общий пример получения каждого поля.

 foreach($results as $result) foreach($result as $key => $value) $fields[$key][] = $value; 

По состоянию на 20 июня в PHP-5.5 появилась новая функция array_column

Например:

 $records = array( array( 'id' => 2135, 'first_name' => 'John', 'last_name' => 'Doe' ), array( 'id' => 3245, 'first_name' => 'Sally', 'last_name' => 'Smith' ), array( 'id' => 5342, 'first_name' => 'Jane', 'last_name' => 'Jones' ), array( 'id' => 5623, 'first_name' => 'Peter', 'last_name' => 'Doe' ) ); $firstNames = array_column($records, 'first_name'); print_r($firstNames); 

Вернется

 Array ( [0] => John [1] => Sally [2] => Jane [3] => Peter ) 

В вышеупомянутой ссылке есть еще больше примеров.

Я проголосовал за @ Devon's response, потому что действительно нет способа сделать то, что вы просите, со встроенной функцией. Лучшее, что вы можете сделать, это написать свой собственный:

 function array_column($array, $column) { $ret = array(); foreach ($array as $row) $ret[] = $row[$column]; return $ret; } 

Начиная PHP 5.3, вы можете использовать этот симпатичный вызов с лямбда-функцией:

 $names = array_map(function ($v){ return $v['name']; }, $results); 

Это вернет массив, нарезанный размером 'name'.

Проще говоря, нет.

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

Я сделал больше исследований по этому вопросу и обнаружил, что у рубина и прототипа есть функция, которая делает это с именем array_pluck , 2 . Интересно, что array_map имеет второе использование, которое позволяет вам делать обратное тому, что я хочу сделать здесь. Я также нашел класс PHP, который кто-то пишет для эмуляции прототипов, манипулирующих массивами.

Я собираюсь сделать еще несколько копаний, и если я больше ничего не найду, я поработаю над патчем, чтобы отправить в список рассылки internals@lists.php.net и посмотреть, добавят ли они файл array_pluck.

Для тех из вас, кто не может перейти на PHP5.5 прямо сейчас и нужна эта функция, вот реализация array_column .

 function array_column($array, $column){ $a2 = array(); array_map(function ($a1) use ($column, &$a2){ array_push($a2, $a1[$column]); }, $array); return $a2; } 

Если вы используете версию PHP до 5.5 и array_column() , вы можете использовать официальную замену в простом PHP:

https://github.com/ramsey/array_column

Я думаю, что это сделает то, что вы хотите

array_uintersect_uassoc

Вам нужно было сделать что-то подобное

 $results = array( array('id' => 1, 'name' => 'red' , 'spin' => 1), array('id' => 2, 'name' => 'green', 'spin' => -1), array('id' => 3, 'name' => 'blue' , 'spin' => .5) ); $name = array_uintersect_uassoc( $results, array('name' => 'value') , 0, "cmpKey"); print_r($name); ////////////////////////////////////////////////// // FUNCTIONS ////////////////////////////////////////////////// function cmpKey($key1, $key2) { if ($key1 == $key2) { return 0; } else { return -1; } } 

Тем не менее, у меня нет доступа к PHP5, поэтому я не тестировал это.

Вы можете сделать:

 $tmp = array_flip($names); $names = array_keys($tmp); 

Это быстрая альтернатива функции array_column ()

 if(!function_exists('array_column')) { function array_column($element_name) { $ele = array_map(function($element) { return $element[$element_name]; }, $a); return $ele; } }