Re: RFC [Discussion] array_column results grouping
| From: | Hendra Gunawan | Date: | Mon, 06 Dec 2021 22:16:44 +0000 |
| Subject: | Re: RFC [Discussion] array_column results grouping | ||
| References: | 1 2 3 4 5 6 7 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-116578@lists.php.net to get a copy of this message | ||
>
> 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.
Best Regards
Hendra Gunawan.