Reputation: 155
I have a data in below JSON format.
$strTree = '{"id":"1","children":[{"id":"316","children":[{"id":"336","children":[{"id":"423"}]},{"id":"337","children":[{"id":"418"}]},{"id":"420"}]},{"id":"405"},{"id":"421"}]}';
And Now I have to build new array using this data for identifying reporting manager
$strTree = [
'316' => '1',
'405' => '1',
'421' => '1',
'336' => '316',
'337' => '316',
'420' => '316',
'418' => '337',
'423' => '336',
]
Here What I have tried, but didn't find out the solution to get the expected result
$strTree = '{
"id": "1",
"children": [{
"id": "316",
"children": [{
"id": "336",
"children": [{"id": "423"}]
},
{
"id": "337",
"children": [{"id": "418"}]
}, {"id": "420"}
]
},
{"id": "405"},
{"id": "421"}
]}';
$arr = (array) json_decode($strTree);
$arrHierarchicalEmpDetails = buildResultedArray($arr, 1);
function buildResultedArray( $elements, $parentId = 0) {
$branch = [];
$elements = (array) $elements;
foreach ($elements as $element) {
$element = (array) $element;
$intID = $element['id'];
$branch[ $intID ] = $parentId;
if (!empty( $element['children'])) {
buildTree( $element['children'], $element['id']);
}
}
return $branch;
}
echo '<pre>'; print_r($arrHierarchicalEmpDetails);
Upvotes: 1
Views: 166
Reputation: 91
Gerber, to solve this problem, you could use a recursive function to "flatten" the hierarchical array:
function flattenHierarchicalArray($inputArray, $parentId = null)
{
$flattenedData = [];
if (!empty($inputArray['children'])) {
foreach ($inputArray['children'] as $child) {
$flattenedData += flattenHierarchicalArray($child, $inputArray['id']);
}
}
if (!is_null($parentId)) {
$flattenedData[$inputArray['id']] = $parentId;
}
return $flattenedData;
}
You should call the function on this way:
flattenHierarchicalArray($data)
Where $data is the hierarchical array decoded from your JSON example. Output:
array(8) {
[423]=>
string(3) "336"
[336]=>
string(3) "316"
[418]=>
string(3) "337"
[337]=>
string(3) "316"
[420]=>
string(3) "316"
[316]=>
string(1) "1"
[405]=>
string(1) "1"
[421]=>
string(1) "1"
}
Note: this function does not keep the order of your expected output, I've asumed that wasn't important at all.
Upvotes: 1