PHP Group Array По результату функции по значению

avatar
Josh Dredge
9 августа 2021 в 02:34
25
1
1

У меня есть массив, который представляет собой простой набор объектов.

Итак

[obj1,obj2,obj3]

Все экземпляры одного класса. Затем я хочу выполнить карту или фильтр, чтобы сгруппировать их по значению в этих объектах.

$userIds = array_map(function($obj){
    return = $obj->getUserId();
}, $objs);

И мне нужен такой результат, когда все объекты отсортированы по идентификаторам пользователей:

[
'user1' => [$obj1],
'user2' => [$obj2, $obj4, $obj6],
'user3' => [$obj3, $obj5],
]

Ищем способ сделать это аккуратно с помощью функций массива, чтобы избежать беспорядочного foreach и перезаписи переменной. У меня есть несколько идей, но, зная PHP, возможно, есть стандартная функция, которая это делает.

Источник

Ответы (1)

avatar
mickmackusa
9 августа 2021 в 02:56
1

array_map() не позволит вам объявить ключи во время итерации.

array_reduce() — подходящая функция для этой задачи; это также свидетельствует о том, что первый уровень в выходном массиве, скорее всего, будет иметь меньшее значение, чем исходный массив.

$objsByUserId = array_reduce(
    $objs,
    function($result, $obj) {
        $result[$obj->getUserId()][] = $obj;
        return $result;
    },
    []
);

Это будет перебирать все строки в $objs и помещать каждый обнаруженный объект в качестве нового элемента в группу на основе возвращенного идентификатора пользователя.