Как получить свойство объекта из каждого объекта в массиве?
Предполагая, что у меня есть массив объектов в PHP, что-то вроде:
Array (
[0] => stdClass Object (
[id] => 1
[name] => Title One
)
[1] => stdClass Object (
[id] => 2
[name] => Title Two
)
[2] => stdClass Object (
[id] => 7
[name] => Title Seven
)
)
Каков наилучший способ (например, самый быстрый) получить массив идентификаторов? т.е. array(1,2,7)
Я могу выполнить цикл вручную, но я считаю, что должен быть лучший метод.
Просто увидел это в подобных вопросах, но там немного обсуждается, является ли принятый ответ действительно лучшим способом, плюс его от 2 лет назад. Я на PHP 5.3.
Ответы
Ответ 1
Самый быстрый путь - это просто цикл (foreach
, for
, while
). Использование функций обратного вызова будет нести лишние накладные расходы.
Я бы посмотрел, есть ли способ создать список через код, который создает исходный массив объектов.
Ответ 2
Вы можете использовать array_map
, чтобы получить идентификаторы от каждого элемента.
function getID($a){
return $a->id;
}
$IDs = array_map('getID', $array);
Демо: http://ideone.com/nf3ug
Ответ 3
Начиная с PHP 7.0 вы можете использовать встроенную функцию array_column
для этого, которая принимает входной массив и имя свойства, которое вы хотите вырвать:
$ids = array_column($input, 'id');
// array(0 => 1, 1 => 2, 2 => 7)
В качестве третьего параметра вы также можете указать индексный ключ:
$ids = array_column($input, 'name', 'id');
// array(1 => 'Title One', 2 => 'Title Two', 7 => 'Title Seven')
Обратите внимание, что, хотя он уже доступен в PHP 5.5.0, поддержка массива объектов была впервые введена в PHP 7.0.
Ответ 4
Вы можете легко сделать это с помощью ouzo goodies
$result = array_map(Functions::extract()->id, $objects);
или с массивами (из-за уродов узу)
$result = Arrays::map($objects, Functions::extract()->id);
Отъезд: http://ouzo.readthedocs.org/en/latest/utils/functions.html#extract
См. также функциональное программирование с помощью ouzo (я не могу опубликовать ссылку).
Ответ 5
Вы пытались выполнить функцию array_keys?
EDIT:
<?php
$ids = array();
for($c=0; $c<count($the_array); $c++) $ids[$c] = $the_array[$c]->id;
?>
Ответ 6
Вы также можете использовать extract_property(), который является хорошо протестированной библиотекой, разработанной специально для этого задания (отказ от ответственности: я автор).
Ответ 7
Я использую RedBean, и почему-то переход в "getID" не работал у меня, так вот как я это сделал:
$ids = array_map(function($val){return $val->id;}, $objects);