> On 30.5.2023, at 21:56, Andreas Hennings <andr...@dqxtech.net> wrote: > > On Tue, 30 May 2023 at 19:25, Boro Sitnikovski <buritom...@gmail.com> wrote: >> >> Here's some more examples: >> >> 1. Use `array_group` to create list of singleton list: >> ``` >> $groups = array_group( $arr, function( $p1, $p2 ) { >> return false; >> } ); >> ``` >> >> (This can also be achieved with `array_map` returning `[ $x ]`) >> >> 2. Distinct groups for consecutive positive and negative elements >> >> ``` >> $arr = [-1,2,-3,-4,2,1,2,-3,1,1,2]; >> >> $groups = array_group( $arr, function( $p1, $p2 ) { >> return ($p1 > 0) == ($p2 > 0); >> } ); >> ``` >> >> This produces `[[-1],[2],[-3,-4],[2,1,2],[-3],[1,1,2]]`, so we can easily >> capture the groups of highs/lows for example. >> >> 3. Group sentences (similar to `explode`, but still different) >> >> ``` >> $arr = "Hello, PHP. Good to see you."; >> $groups = array_group( str_split( $arr ), function( $p1, $p2 ) { >> return '.' !== $p1; >> } ); >> >> $groups = array_map( 'join', $groups ); >> ``` >> >> Producing `[ "Hello, PHP.", " Good to see you." ]`. >> >> 4. Grouping book sections >> ``` >> $book_sections = [ '1.0', '1.1', '1.2', '2.0', '2.1', '3.0', '3.1' ]; >> $groups = array_group( $book_sections, function( $p1, $p2 ) { >> return $p1[0] === $p2[0]; >> } ); >> ``` >> >> Producing `[ [ '1.0', '1.1', '1.2' ], [ '2.0', '2.1'], [ '3.0', '3.1' ] ]` >> >> and so on... >> >> Basically, it's a very general utility :) >> >> Best, >> >> Boro > > Only one of these examples actually uses a comparison function that > actually compares two adjacent values. > All the others look at a single value only, or they don't care about > the original order at all. > > And that example (2) seems quite artificial and rare. > >> so we can easily capture the groups of highs/lows for example > > How often does this problem come up in practice? > > I did actually have a look at the Haskell doc page you linked. > https://hackage.haskell.org/package/groupBy-0.1.0.0/docs/Data-List-GroupBy.html > I wonder where this is used in the Haskell world, and how often they > need this true comparison of adjacent values. > The examples from the doc page are quite artificial. That's ok for a > doc page, but does not make a good argument for why we need it.
Thanks for digging deeper in trying to understand the value that this would bring. For a more realistic example, check the following gist: https://gist.github.com/bor0/b5f449bfe85440d96abd933b9f03b310#file-test_datetime_group-php. This was a very recent thing I worked on in production. The events came ordered from the database. But also, this is not the first time I was in need of a grouping functionality. Sorry for repeating, but I see it as a handy utility. We can bring the same argument for any of the `array_*` functions because most of them can be implemented with for loops. If the main concern is the consecutive processing of the elements, we could add a third argument to `array_group` (flag) that would allow users to alter the processing behaviour - at a price, consecutive taking O(n) vs all elements taking something close to O(n^2) -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php