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

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to