Нарезка многомерного массива 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;
Ответы
Ответ 1
По состоянию на 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
)
В вышеупомянутой ссылке есть еще больше примеров.
Ответ 2
Я проголосовал за ответ @Devon, потому что действительно нет способа делать то, что вы просите, со встроенной функцией. Лучшее, что вы можете сделать, это написать свой собственный:
function array_column($array, $column)
{
$ret = array();
foreach ($array as $row) $ret[] = $row[$column];
return $ret;
}
Ответ 3
Начиная PHP 5.3, вы можете использовать этот симпатичный вызов с помощью лямбда-функции:
$names = array_map(function ($v){ return $v['name']; }, $results);
Это вернет массив, нарезанный размером 'name'.
Ответ 4
Проще говоря, нет.
Вам нужно будет использовать цикл или функцию обратного вызова, например array_walk.
Ответ 5
Я сделал больше исследований по этому вопросу и обнаружил, что у рубина и прототипа есть функция, которая делает это array_pluck, 2. Интересно, что array_map
имеет второе применение, которое позволяет вам делать обратное тому, что я хочу сделать здесь. Я также нашел PHP class, который кто-то пишет, чтобы эмулировать манипуляции массивами прототипов.
Я собираюсь сделать еще несколько копаний, и если я больше ничего не найду, я буду работать над патчем, чтобы отправить в список рассылки [email protected] и посмотреть, добавят ли они файл array_pluck.
Ответ 6
Для тех из вас, кто не может перейти на 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;
}
Ответ 7
Если вы используете версию PHP до 5.5 и array_column()
, вы можете использовать официальную замену в простом PHP:
https://github.com/ramsey/array_column
Ответ 8
Я думаю, что это сделает то, что вы хотите
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, поэтому я не тестировал это.
Ответ 9
Вы можете сделать:
$tmp = array_flip($names);
$names = array_keys($tmp);
Ответ 10
Это быстрая альтернатива функции array_column()
if(!function_exists('array_column')) {
function array_column($element_name) {
$ele = array_map(function($element) {
return $element[$element_name];
}, $a);
return $ele;
}
}