Скажем, например, вы просто запросили базу данных, и вы получили этот 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:
Я думаю, что это сделает то, что вы хотите
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; } }