Предполагая, что у меня есть массив объектов в 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)
я могу array(1,2,7)
вручную, но я считаю, что должен быть лучший метод.
Просто видел это в подобных вопросах, но есть небольшая дискуссия о том, является ли принятый ответ действительно лучшим способом, плюс это от 2 лет назад. Я на PHP 5.3.
Самый быстрый путь – это просто цикл ( foreach
, for
, while
). Использование функций обратного вызова будет нести лишние накладные расходы.
Я бы посмотрел, есть ли способ создать список через код, который создает исходный массив объектов.
Вы можете использовать array_map
для получения идентификаторов от каждого элемента.
function getID($a){ return $a->id; } $IDs = array_map('getID', $array);
Демо: http://ideone.com/nf3ug
Начиная с 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.
Вы можете сделать это легко с uuzo goodies
$result = array_map(Functions::extract()->id, $objects);
или с массивами (из узе-лайтов)
$result = Arrays::map($objects, Functions::extract()->id);
Выезд: http://ouzo.readthedocs.org/ru/latest/utils/functions.html#extract
См. Также функциональное программирование с ouzo (я не могу опубликовать ссылку).
Вы пытались использовать функцию array_keys ?
РЕДАКТИРОВАТЬ:
<?php $ids = array(); for($c=0; $c<count($the_array); $c++) $ids[$c] = $the_array[$c]->id; ?>
Вы также можете использовать extract_property (), который является хорошо протестированной библиотекой, специально разработанной для этой работы (отказ от ответственности: я автор).
Я использую RedBean и почему-то переход в «getID» не работал для меня, так вот как я это сделал:
$ids = array_map(function($val){return $val->id;}, $objects);