Re: [RFC] [Discussion] Add new function `array_group`

From: 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 >>>> >>

« previous php.internals (#120465) next »