Подтвердить что ты не робот

Как получить свойство объекта из каждого объекта в массиве?

Предполагая, что у меня есть массив объектов в 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.

4b9b3361

Ответ 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);