Re: RFC [Discussion] array_column results grouping
| From: | Larry Garfield | 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