<?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