Re: [RFC] [Discussion] Add new function `array_group`
| From: | Boro Sitnikovski | Date: | Tue, 30 May 2023 16:27:12 +0000 |
| Subject: | Re: [RFC] [Discussion] Add new function `array_group` | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-120465@lists.php.net to get a copy of this message | ||
Hi,
Thank you for your thoughts.
> I would say the more common desired behavior is the one in your first
> example. And even for that we don't have a native function.
This Google search might give more insight into the number of discussions about a grouping
functionality: https://www.google.com/search?q=php+group+elements+site:stackoverflow.com
> Your behavior can be implemented in userland like so:
> https://3v4l.org/epvHm
Correct, but then again, we can also implement
array_map/array_filter/etc.
in userland :)
> I think you need to make a case as to why the behavior you describe
> justifies a native function.
Similar to my previous answer, but also in general - ease of access and also performance.
> E.g. if you find a lot of public php code that does this kind of grouping.
>
> I personally suspect it is not that common.
>
> Cheers
> Andreas
>
>
> On Tue, 30 May 2023 at 17:08, Boro Sitnikovski <buritomath@gmail.com> wrote:
>>
>> 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 ¬
>> Awœ•¿j".Nú|°_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
>>>>
>>