Re: [RFC] [Discussion] Add new function `array_group`
| From: | Boro Sitnikovski | Date: | Tue, 30 May 2023 13:13:18 +0000 |
| Subject: | Re: [RFC] [Discussion] Add new function `array_group` | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-120454@lists.php.net to get a copy of this message | ||
Updated the patch: added a test about increasing subsequences example, and a minor bugfix.

> On 30.5.2023, at 13:34, Boro Sitnikovski <buritomath@gmail.com> wrote:
>
> 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 <ZŽŠÜþpÐÓa
> V=ÚËJhttps://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>
>
> <array_group.patch>
Attachment: [application/octet-stream] array_group.patch