转换平面对象数组介绍树

Transform flat array of objects intro tree

我有一个像这样的平面对象数组:

[
  {
    id: "a",
    parent-id: ""
  },
  {
    id: "b",
    parent-id: "a"
  },
  {
    id: "c",
    parent-id: "b"
  },
  {
    id: "d",
    parent-id: ""
  },
  ...
]

我想将这个平面数组解析为树结构,其中具有父 ID 的对象作为其父元素的子元素插入,如下所示:

[
  {
    id: "a",
    parent-id: "",
    children: [
      {
        id: "b",
        parent-id: "a",
        children: [
          {
            id: "c",
            parent-id: "b"
          }
        ]
      }
    ]
  },
  {
    id: "d",
    parent-id: ""
  },
  ...
]

转换发生在客户端还是服务端并不重要,所以我的选择是PHP或者JS。最简单的方法是什么?

在PHP你可以试试:

$foo = // your flat array of associative arrays


// add the top level nodes to an array

$result = array();
foreach ($foo as $node) {
    if ($node['parent-id'] === '') {
        $node['children'] = array();
        array_push($result, $node);
    }
}

// recursively iterate this array adding the children

addChildrenToArray($result, $foo);

function addChildrenToArray(&$array, $children) {
    $parent_i = 0;
    $child_i = 0;
    foreach ($array as $parent_node) {
        foreach ($children as $child_node) {
            if ($child_node['parent-id'] == $parent_node['id']) {
                $child_node['children'] = array();
                array_push($array[$parent_i]['children'], $child_node);
                addChildrenToArray($array[$parent_i]['children'], $children);
                $child_i++;
            }
        }
        $parent_i++;
    }
}