1

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);
2
  • $arr = json_decode($strTree, true); will give you an array, if you dont like using objects. Commented Sep 27, 2018 at 13:33
  • @RiggsFolly I have converted that JSON into an array, but am unable yo prepare expected array from the converted array. Commented Sep 27, 2018 at 13:35

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

2 Comments

I just modified $inputArray [ $inputArray = (array) $inputArray ] type to array & it works for me. Thanks a lot.
@GajananKolpuke you're welcome. To avoid the cast of the $inputArray variable, you could pass true as the second parameter of json_decode. With that parameter json_decode returns an associative array instead of a PHP StdObject.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.