3v4l.org

run code in 300+ PHP versions simultaneously
<?php $items = [ ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'f'], ['item1' => 'a', 'item2' => 'c', 'item3' => 'd2', 'item4' => 'g'], ['item1' => 'a', 'item2' => 'd', 'item3' => 'd3', 'item4' => 'h'], ['item1' => 'a', 'item2' => 'd', 'item3' => 'e', 'item4' => 'i'], ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'j'], ['item1' => 'b', 'item2' => 'c', 'item3' => 'e', 'item4' => 'k'] ]; $result = []; foreach ($items as $row) { $k1 = $row['item1']; $k2 = $row['item1'] . '_' . $row['item2']; $k3 = $row['item1'] . '_' . $row['item2'] . '_' . $row['item3']; if (!isset($ref3[$k3])) { $ref3[$k3] = [$row['item3'], [$row['item4']]]; if (!isset($ref2[$k2])) { $ref2[$k2] = [$row['item2'], &$ref3[$k3]]; if (!isset($ref1[$k1])) { $ref1[$k1] = [$row['item1'], &$ref2[$k2]]; $result[] = &$ref1[$k1]; } else { $ref1[$k1][] = &$ref2[$k2]; } } else { $ref2[$k2][1][] = &$ref3[$k3]; } } else { $ref3[$k3][1][] = $row['item4']; } } echo json_encode($result);
Output for 8.0.1 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.25, 8.4.1 - 8.4.12
[["a",["c",["d2",["f","g"]]],["d",["d3",["h"],["e",["i"]]]]],["b",["c",["e",["j","k"]]]]]

preferences:
80.69 ms | 406 KiB | 5 Q