[RFC] [Discussion] Add new function `array_group`
| From: | Boro Sitnikovski | Date: | Tue, 30 May 2023 11:34:49 +0000 |
| Subject: | [RFC] [Discussion] Add new function `array_group` | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-120451@lists.php.net to get a copy of this message | ||
Hello all,
As per the How To Create an RFC <https://wiki.php.net/rfc/howto> instructions, I am
sending this e-mail in order to get your feedback on my proposal.
I propose introducing a function to PHP core named
Attachment: [application/octet-stream] array_group.patch
array_group. This function takes an
array and a function and returns an array that contains arrays - groups of consecutive elements.
This is very similar to Haskell's groupBy function <https://hackage.haskell.org/package/groupBy-0.1.0.0/docs/Data-List-GroupBy.html>.
For some background as to why - usually, when people want to do grouping in PHP, they use hash maps,
so something like:
```
<?php
$array = [
[ 'id' => 1, 'value' => 'foo' ],
[ 'id' => 1, 'value' => 'bar' ],
[ 'id' => 2, 'value' => 'baz' ],
];
$groups = [];
foreach ( $array as $element ) {
$groups[ $element['id'] ][] = $element;
}
var_dump( $groups );
```
This can now be achieved as follows (not preserving keys):
```
<?php
$array = [
[ 'id' => 1, 'value' => 'foo' ],
[ 'id' => 1, 'value' => 'bar' ],
[ 'id' => 2, 'value' => 'baz' ],
];
$groups = array_group( $array, function( $a, $b ) {
return $a['id'] == $b['id'];
} );
```
The disadvantage of the first approach is that we are only limited to using equality check, and we
cannot group by, say, < or other functions.
Similarly, the advantage of the first approach is that the keys are preserved, and elements
needn't be consecutive.
In any case, I think a utility function such as array_group will be widely useful.
Please find attached a patch with a proposed implementation. Curious about your feedback.
Best,
Boro Sitnikovski <https://people.php.net/bor0>

Attachment: [application/octet-stream] array_group.patch