dongniaoli1822 2018-09-27 13:27
浏览 38
已采纳

如何将Hierarchical从数组转换为单个数组

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);
  • 写回答

1条回答 默认 最新

  • douren1891 2018-09-27 14:44
    关注

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何构建全国统一的物流管理平台?
  • ¥100 ijkplayer使用AndroidStudio/CMake编译,如何支持 rtsp 直播流?
  • ¥20 和学习数据的传参方式,选择正确的传参方式有关
  • ¥15 这是网络安全里面的poem code
  • ¥15 用js遍历数据并对非空元素添加css样式
  • ¥15 使用autodl云训练,希望有直接运行的代码(关键词-数据集)
  • ¥50 python写segy数据出错
  • ¥20 关于线性结构的问题:希望能从头到尾完整地帮我改一下,困扰我很久了
  • ¥30 3D多模态医疗数据集-视觉问答
  • ¥20 设计一个二极管稳压值检测电路