Hi mickmackusa,
> Instead of potentially creating array_partition() and eventually
> array_group(), I feel any benefits of array_partition() should be baked
> into an array_group() function for greater utility in a unified function.
Thanks for thinking it through. Seeded keys would indeed solve the
missing-bucket problem, and with string labels the result reads well:
['adults' => $adults, 'minors' => $minors] = array_group(
$users,
fn($u) => $u->age >= 18 ? 'adults' : 'minors',
['adults', 'minors'],
);
I still think the two-way split deserves its own function, for three
reasons:
1. Destructuring is by key, not by order. With a boolean callback, the
keys become 1 and 0 whatever order they are seeded in, so
[$adults, $minors] = array_group($users, $predicate, [true, false])
puts the minors in $adults. You have to switch to labels, as above.
2. With labels, the callback, the seed list and the destructuring keys
have to agree. A typo ('adult' vs 'adults') silently creates a third
group and leaves one variable empty. array_partition() only needs a
predicate, and its result shape is fixed.
3. PHP already pairs general functions with simpler, specialised ones
for common cases: array_filter() with array_find() and array_any().
A two-way split is common enough to warrant the same treatment.
It doesn't rule out a future array_group(), which raises its own
design questions (return shape, unknown keys, key preservation).
I'll add the seeded-keys alternative to the RFC's "Why not a general
grouping function?" section.
Thanks,
Ayoub
On Mon, Oct 26, 2026 at 12:26 PM mickmackusa <[email protected]> wrote:
>
> I wouldn't be disappointed to see array_partition() added to the language,
> but the longer I think about it, a well-designed `array_group()` function
> could provide the equivalent behavior as well as afford other than just 2
> static groups.
>
> It seems like the only relevant difference is the fact that array_partition()
> always returns an indexed array of two arrays without needing to push 2 empty
> arrays for padding. Theoretically, array_group() might not return any
> subarrays when there are no qualifying items to retain. Does array_group()
> need an optional 3rd parameter which declares an empty array for each
> nominated grouping key which can be nominated in a particular order? Food for
> thought.
>
> Instead of potentially creating array_partition() and eventually
> array_group(), I feel any benefits of array_partition() should be baked into
> an array_group() function for greater utility in a unified function.
>
> mickmackusa