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