Re: RFC [Discussion] array_column results grouping

From: Date: Tue, 07 Dec 2021 00:59:35 +0000
Subject: Re: RFC [Discussion] array_column results grouping
References: 1 2 3 4 5 6 7 8  Groups: php.internals 
Request: Send a blank email to internals+get-116579@lists.php.net to get a copy of this message
On Mon, Dec 6, 2021, at 4:16 PM, Hendra Gunawan wrote: >> >> Hello Folks, Thanks a lot for your feedback, as already mentioned in >> the RFC and as mentioned by Rowan too a new function is an option. I >> think that mostly we will go with the new function option. >> I will try to edit the PR to add a new function, does there any >> suggestions/naming conventions for the new function? a colleague >> suggested being array_group_by and Hendra already suggested >> to be >> array_column_group which is good too. > > It would be better if You add another voting item for this one. In my opinion, > column is less important to be included, and > array_group is sufficiently > descriptive. > > reducer is one of the candidates to be included. Additionally, > there are > mapper, filter, and > sorter. So Obviously we need a new function, rather > than modify the old one. > > To be clear and to make it simpler, all callbacks operate on the deepest > subgroup. > > Signature: > > reducer(array|object $item, int|string $index, mixed $cumulative): mixed > mapper(array|object $item): array|object > filter(array|object $item, int|string $index): bool > sorter(array|object $item1, array|object $item2): int > > A note in case you are able to implement them: > - reducer and mapper cannot > coexist in a single function call. > - filter should be executed before > reducer or mapper. > - sorter should be decided whether it executes before or after > reducer/ > mapper: sorter is more > suitable to execute before filter, but more > suitable after mapper. > > A note for consumers: > - mapper is designed to operate on the subgroup item, but it > can be operated > on the field value of the item. > - filtering can be done inside reducer or > mapper, but the number of > subgroup members is as it is. With dedicated filter supplied, > we can > decrease the number. > - If You want to filter an intermediate group, You can use > unset or if-else > > > $group = array_group($people, ["education", "sex"], FN_REDUCER); > foreach ($group as &$eduGroup) { > foreach ($eduGroup as &$sexGroup) { > unset($sexGroup["male"]); > } > } > > Not a perfect solution, but at least your code is reduced. Better map/filter/reduce primitives in PHP would be dandy, but they have nothing to do with array grouping. They're a separate operation that should be composed with grouping. Packing them all into a single function sounds like a terrible idea. If we wanted that... that's called list comprehensions, which I *would* support and even tried to rally support for a few years ago, but got met with a big shrug. :-) --Larry Garfield

« previous php.internals (#116579) next »