Re: [RFC] [Discussion] Add new function `array_group`
| From: | Boro Sitnikovski | Date: | Tue, 30 May 2023 15:08:46 +0000 |
| Subject: | Re: [RFC] [Discussion] Add new function `array_group` | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-120459@lists.php.net to get a copy of this message | ||
Hey,
Thanks for the suggestion.
For the previous case in the code, I added these in a Gist to not clutter here too much:
1. The first example corresponds to https://gist.github.com/bor0/b5f449bfe85440d96abd933b9f03b310#file-test_manual_group-php
2. The second example corresponds to https://gist.github.com/bor0/b5f449bfe85440d96abd933b9f03b310#file-test_array_group-php
3. Another example, addressing the problem of increasing subsequences is very simple with
array_group: https://gist.github.com/bor0/b5f449bfe85440d96abd933b9f03b310#file-test_array_incr_subseqs-php
Best,
Boro
> On 30.5.2023, at 16:57, Andreas Hennings <andreas@dqxtech.net> wrote:
>
> Hello Boro,
> I think you should include the "expected result" in your code examples.
> Maybe this is in your patch file, but I don't think we want to look at
> that for discussion.
>
> Cheers
> Andreas
>
> On Tue, 30 May 2023 at 13:35, Boro Sitnikovski <buritomath@gmail.com> wrote:
>>
>> Hello all,
>>
>> As per the How To Create an RFC 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
>> 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.
>>
>> 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
>>