3v4l.org

run code in 300+ PHP versions simultaneously
<?php $json = '[ {"id":3633,"name":"Mobile phones and accessories","left":1,"right":18,"level":1,"elements":0}, {"id":3638,"name":"Mobile phones","left":2,"right":3,"level":2,"elements":174}, {"id":21396,"name":"Tablets","left":19,"right":24,"level":1,"elements":0}, {"id":21450,"name":"Some Tablets","left":20,"right":21,"level":2,"elements":8}, {"id":21450,"name":"other Tablets","left":20,"right":21,"level":2,"elements":8} ]'; $data = new ArrayIterator(json_decode($json, true)); function buildTree(iterator $data, int $level = 1): array { $tree = array(); while ($data->valid()) { $item = $data->current(); if ($item['level'] < $level) return $tree; if ($item['level'] === $level) { $data->next(); $tree[] = [ 'item' => $item, 'children' => buildTree($data, $level + 1), ]; } } return $tree; } $tree = buildTree($data); print_r($tree); ?>
Output for 8.1.23 - 8.1.33, 8.2.7 - 8.2.29, 8.3.0 - 8.3.25, 8.4.1 - 8.4.12
Array ( [0] => Array ( [item] => Array ( [id] => 3633 [name] => Mobile phones and accessories [left] => 1 [right] => 18 [level] => 1 [elements] => 0 ) [children] => Array ( [0] => Array ( [item] => Array ( [id] => 3638 [name] => Mobile phones [left] => 2 [right] => 3 [level] => 2 [elements] => 174 ) [children] => Array ( ) ) ) ) [1] => Array ( [item] => Array ( [id] => 21396 [name] => Tablets [left] => 19 [right] => 24 [level] => 1 [elements] => 0 ) [children] => Array ( [0] => Array ( [item] => Array ( [id] => 21450 [name] => Some Tablets [left] => 20 [right] => 21 [level] => 2 [elements] => 8 ) [children] => Array ( ) ) [1] => Array ( [item] => Array ( [id] => 21450 [name] => other Tablets [left] => 20 [right] => 21 [level] => 2 [elements] => 8 ) [children] => Array ( ) ) ) ) )

preferences:
75.75 ms | 417 KiB | 5 Q