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.

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

报告相同问题?

悬赏问题

  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 spring后端vue前端
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题