根据父 ID 值将数组从一维转换为多维

Ema*_*sev 6 php arrays recursion multidimensional-array

我有一个代表多维数据的一维对象数组:

array(
    array(
        "id" => 45,
        "parent_id" => null
    ),
    array(
        "id" => 200,
        "parent_id" => 45
    ),
    array(
        "id" => 345,
        "parent_id" => 45
    ),
    array(
        "id" => "355",
        "parent_id" => 200
    )
);
Run Code Online (Sandbox Code Playgroud)

我应该如何将其转换为多维数组:

array(
    array(
        "id" => 45,
        "parent_id" => null,
        "children" => array(
            array(
                "id" => 200,
                "parent_id" => 45,
                "children" => array(
                    "id" => "355",
                    "parent_id" => 200
                )

            ),
            array(
                "id" => 345,
                "parent_id" => 45
            ),
        )
    ),
);
Run Code Online (Sandbox Code Playgroud)

hak*_*kre 5

以下代码示例将数组转换$array为您要查找的树结构:

// key the array by id
$keyed = array();
foreach($array as &$value)
{
    $keyed[$value['id']] = &$value;
}
unset($value);
$array = $keyed;
unset($keyed);

// tree it
$tree = array();
foreach($array as &$value)
{
    if ($parent = $value['parent_id'])
        $array[$parent]['children'][] = &$value;
    else
        $tree[] = &$value;
}
unset($value);
$array = $tree;
unset($tree);

var_dump($array); # your result
Run Code Online (Sandbox Code Playgroud)

如果现有父 ID 为 ,则此方法不起作用0。但可以很容易地改变以反映这一点。

这是一个相关的问题,原始数组已经被键入,因此解决方案的前半部分可以省去:嵌套数组。第三层正在消失

编辑:

那么这是如何运作的呢?这是利用 PHP 变量别名(也称为引用)和(临时)数组,用于存储 a) 节点别名 ( $keyed) 和 b) 来构建新的树顺序 ( $tree)。

$array = $keyed您能[...]解释一下和的目的吗$array = $tree

由于 和 都$keyed包含$tree对 中的值的引用$array,我首先将该信息复制到 中$array,例如:

$array = $keyed;
Run Code Online (Sandbox Code Playgroud)

由于 now$keyed仍处于设置状态(并且包含对与 中相同值的引用$array),$keyed因此未设置:

unset($keyed);
Run Code Online (Sandbox Code Playgroud)

这将取消设置所有引用$keyed并确保$array不再引用所有值(该值的引用计数减一)。

如果迭代后未取消设置临时数组,则它们的引用仍然存在。如果您使用var_dumpon ,您会看到所有值前面$array都有一个,因为它们仍然被引用。再次删除这些引用,您将看到s 消失了。&unset($keyed)var_dump($array)&

我希望这是可以理解的,如果您不熟悉参考文献,有时可能会很难理解。它经常帮助我将它们视为变量别名。

如果您想要锻炼身体,请考虑以下事项:

如何$array通过一次 foreach 迭代将平面从平面转换为树?

您可以自行决定何时单击包含解决方案的链接。