当前位置: 首页 > 面试题库 >

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

鱼意远
2023-03-14
问题内容

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

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
    )
);

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

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
            ),
        )
    ),
);

问题答案:

以下代码示例 数组$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

如果 现有的 父ID为,则此方法无效0。但是可以很容易地更改以反映这一点。

编辑:

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

你能[…]解释的目的$array = $keyed$array = $tree并取消设置?

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

$array = $keyed;

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

unset($keyed);

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

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

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

如果您想做些运动,请考虑以下事项:

如何$array使用一次foreach迭代将您的平面从树转换为树?

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



 类似资料:
  • 问题内容: 我有一个无缘无故的多维数组 我想将此数组转换为这种形式 任何想法如何做到这一点? 问题答案: 假设此数组可能是(也可能不是)冗余嵌套,并且您不确定它的深度,可以为您展平它:

  • 问题内容: 将多维javascript数组转换为JSON的最佳方法是什么? 问题答案: 大多数流行的JavaScript框架都包含JSON实用程序功能。例如,jQuery具有直接调用url并将JSON结果作为对象加载的函数: http //docs.jquery.com/Getjson 但是,您可以从json网站获取开源JSON解析器和字符串化器: https://github.com/dougl

  • 问题内容: 我有一个包含树数据的数组(按父ID)。我想将其转换为多维数组。做到这一点的最佳方法是什么?是否有任何简短功能? 源数组: 源数组中缺少某些父母。我希望缺少父项的项成为根。结果数组: 更新:删除方括号。 问题答案: 我认为PHP中没有内置函数可以做到这一点。 我尝试了以下代码,似乎可以按照您描述的方式准备嵌套数组: 我在为演示文稿SQL和PHP中的层次模型编写的PHP类中编写了类似的算法

  • 问题内容: 我已经有了用于将一维二维转换为一维二维的代码,但是我不知道如何将其转换。这是我的代码: 问题答案: 您正在寻找类似的东西: 与以下内容相同: 但试图帮助进一步解释这个概念。

  • 这行代码给我抛出了异常:线程“main”中的异常java.lang.IndexOutofBoundsExc的索引:5,大小:5 我试图将数组列表转换成多维数组。

  • 问题内容: 我想通过指定2D数组中的列数将一维数组转换为二维数组。可能会像这样工作: numpy是否具有与我的虚构函数“ vec2matrix”相似的功能?(我知道您可以像2D数组一样索引1D数组,但这不是我拥有的代码中的选项- 我需要进行此转换。) 问题答案: 您要阵列。 其中,根据输入数组的大小推断新维的大小。