What I have:
array(
    [
        'id' => 12, 'group' => 'abc', 'name' => 'Lorem',
    ],
    [
        'id' => 12, 'group' => 'def', 'name' => 'Ipsum',
    ],
    [
        'id' => 34, 'group' => 'ghi', 'name' => 'Dolor',
    ],
    [
        'id' => 34, 'group' => 'jkl', 'name' => 'Sit',
    ],
    [
        'id' => 34, 'group' => 'mno', 'name' => 'Amet',
    ],
);
What I want:
array (size=2)
  12 => 
    array (size=2)
      'abc' => 
        array (size=3)
          'id' => int 12
          'group' => string 'abc' (length=3)
          'name' => string 'Lorem' (length=5)
      'def' => 
        array (size=3)
          'id' => int 12
          'group' => string 'def' (length=3)
          'name' => string 'Ipsum' (length=5)
  34 => 
    array (size=3)
      'ghi' => 
        array (size=3)
          'id' => int 34
          'group' => string 'ghi' (length=3)
          'name' => string 'Dolor' (length=5)
      'jkl' => 
        array (size=3)
          'id' => int 34
          'group' => string 'jkl' (length=3)
          'name' => string 'Sit' (length=3)
      'mno' => 
        array (size=3)
          'id' => int 34
          'group' => string 'mno' (length=3)
          'name' => string 'Amet' (length=4)
What I tried:
The obvious:
$sorted = array();
foreach ($products as $product) {
    $sorted[$product['id']][$product['group']] = $product;
}
$products = $sorted;
unset($sorted);
But then, in an effort to avoid foreach() loops, and with help of @atomrc's answer to How to group subarrays by a column value?, I came up with this:
$sorted = array_reduce($products, function ($accumulator, $element) {
    $accumulator[$element['id']][] = $element;
    return $accumulator;
}, []);
array_walk($sorted, function(&$item) {
    $item = array_reduce($item, function ($accumulator, $element) {
        $accumulator[$element['group']] = $element;
        return $accumulator;
    }, []);
});
So while the above looks cool and all, it's also much bigger and seemingly more complex than that foreach. This is probably because my experience with array_reduce() is limited. Is there a way to have the array grouped in one go? For example, in the first array_reduce() call.
 
    