3v4l.org

run code in 300+ PHP versions simultaneously
<?php function treeifyDbRows(array $inputArray, array $branchRules): array { $output = []; if ($branchRules) { $ruleSet = array_shift($branchRules); $masterRule = $ruleSet[0]; $branchChildren = []; foreach ($inputArray as $index => $element) { $branchChildren[] = $element; //coalesce null to 0 if (($inputArray[$index + 1][$masterRule] ?? 0) !== $element[$masterRule]) { $branch = []; foreach ($ruleSet as $rule) { $branch[$rule] = $branchChildren[0][$rule]; } $children = treeifyDbRows($branchChildren, $branchRules); if ($children) { $branch['children'] = $children; } $output[] = $branch; $branchChildren = []; } } } return $output; } $data = [ [ "countryID" => 1, "countryName" => "USA", "regionID" => 10, "regionName" => "Indiana", "cityID" => 100, "cityName"=> "Indianapolis", ], [ "countryID" => 1, "countryName" => "USA", "regionID" => 10, "regionName" => "Indiana", "cityID" => 101, "cityName"=> "Bloomington", ], [ "countryID" => 1, "countryName" => "USA", "regionID" => 11, "regionName" => "Michigan", "cityID" => 102, "cityName"=> "Lansing", ], [ "countryID" => 2, "countryName" => "Canada", "regionID" => 12, "regionName" => "Ontario", "cityID" => 103, "cityName"=> "Toronto", ], [ "countryID" => 2, "countryName" => "Canada", "regionID" => 12, "regionName" => "Ontario", "cityID" => 104, "cityName"=> "Ottawa", ], [ "countryID" => 2, "countryName" => "Canada", "regionID" => 12, "regionName" => "Ontario", "cityID" => 105, "cityName"=> "Windsor", ], [ "countryID" => 2, "countryName" => "Canada", "regionID" => 25, "regionName" => "Quebec", "cityID" => 106, "cityName"=> "Montreal", ], ]; $rules = [ ["countryID", "countryName"], ["regionID", "regionName"], ["cityID", "cityName"], ]; $results = treeifyDbRows($data, $rules); var_dump($results);

preferences:
55.43 ms | 402 KiB | 5 Q