Re: [RFC] [Discussion] Add new function `array_group`
| From: | Boro Sitnikovski | Date: | Wed, 31 May 2023 23:02:31 +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-120495@lists.php.net to get a copy of this message | ||
> On 1.6.2023, at 00:59, Larry Garfield <larry@garfieldtech.com> wrote:
>
> On Wed, May 31, 2023, at 10:47 PM, Boro Sitnikovski wrote:
>
>> 1. The grouping that JavaScript/.NET/Lodash/Scala/etc. do (this should
>> be the default of
array_group)
>> 2. The grouping that Haskell does, the one I proposed earlier (this can
>> be altered in a flag within array_group)
>>
>> Based on this, I'd like to adjust my initial proposal, where we would
>> have the following function: `function array_group(array $array,
>> callable $callback, bool $consecutive_pairs = false): array {}`
>>
>> If the argument consecutive_pairs is false, it will use the
>>
>> function's return value to do the grouping ($callback accepting single
>> element in this case)
>> Otherwise, it will use the function's boolean return value to check if
>> two consecutive elements need to be grouped ($callback accepting two
>> elements in this case)
>>
>> (This approach seems to be consistent with array_filter in
>> the sense
>> the callback accepts one or two arguments)
>>
>> With a few example usages:
>>
>> ```
>> var_dump( array_group($arr1, function( $x ) {
>> return (string) strlen( $x );
>> } ) );
>> // Producing ['3' => ['one', 'two'], '5' =>
>> ['three']]
>> ```
>>
>> Another one:
>>
>> ```
>> $arr = [-1,2,-3,-4,2,1,2,-3,1,1,2];
>>
>> $groups = array_group( $arr, function( $p1, $p2 ) {
>> return ($p1 > 0) == ($p2 > 0);
>> } );
>> // Producing [[-1],[2],[-3,-4],[2,1,2],[-3],[1,1,2]]
>> ```
>
> This sounds like two separate functions in a trenchcoat. It should be two separate functions.
>
>> I believe this proposal captures many use cases, beyond the examples we
>> discussed. Curious about any other thoughts.
>>
>> I'm also attaching a PoC patch that implements this.
>>
>> Attachments:
>> * array_group.patch
>
> Side note: I don't think anyone reads patches sent to the list. I didn't even
> realize it allowed attachments. :-) If you want someone to review code, a GitHub PR is the way to
> go.
>
> You can also include benchmarks there. From experience, if you don't have a compelling
> reason why this *needs* to be in C rather than PHP (which in this case boils down to performance
> exclusively), you're not going to be able to convince people to add another random utility
> function. That's just the reality these days.
>
> --Larry Garfield
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
Thank you for your thoughts. We can definitely separate them in two functions. Also thanks on the
note for the patches - will keep it in mind :)
Good point on the benchmarks, I will keep those in mind.
Beyond performance, I think this has to do with developer experience pretty much, too. Almost all
mainstream languages have a built-in grouping function, and in my honest opinion, it's time PHP
has one too :) I think we can all agree grouping is a very common/basic functionality that we all
meet with regularly.