按父/子ID重组数组.递归?

dan*_*est 5 php arrays recursion logic

我有一系列的位置.这些位置中的每一个都可以具有子位置.每个子位置也可以有孩子,依此类推:

$locations = array(
    array("id" => 1,  "parent_id" => 0, "name" => "England"),
    array("id" => 2,  "parent_id" => 0, "name" => "Scotland"),
    array("id" => 3,  "parent_id" => 0, "name" => "Ireland"),
    array("id" => 4,  "parent_id" => 0, "name" => "Wales"),
    array("id" => 5,  "parent_id" => 1, "name" => "East England"),
    array("id" => 6,  "parent_id" => 1, "name" => "London"),
    array("id" => 7,  "parent_id" => 6, "name" => "West London"),
    array("id" => 8,  "parent_id" => 6, "name" => "East London"),
    array("id" => 9,  "parent_id" => 1, "name" => "East Midlands"),
    array("id" => 10, "parent_id" => 9, "name" => "Derbyshire")
);
Run Code Online (Sandbox Code Playgroud)

我想重新构造这个数组,以便子节点是父节点的数组.像这样(未经测试):

$locations =    array("id" => 1, "parent_id" => 0, "name" => "England", "children" => array(
                    array("id" => 5,  "parent_id" => 1, "name" => "East England"),
                    array("id" => 6,  "parent_id" => 1, "name" => "London", "children" => array(
                            array("id" => 7,  "parent_id" => 6, "name" => "West London"),
                            array("id" => 8,  "parent_id" => 6, "name" => "East London")))));
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用缩进打印出来,如下所示:

LOCATIONS

England
- East England
- London
-- West London
-- East London
- East Midlands
-- Derbyshire
Scotland
Ireland
Wales
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几种方法,比如用父ID对它们进行分组,但是我无法解决这个问题的逻辑,并且可能有更好的方法(递归,也许?).

非常感谢.