
本文介绍了一种将扁平数组转换为树形结构的方法,该数组中的元素通过点符号表示层级关系,并使用 “type” 属性区分不同类型的节点。通过对数组进行两次遍历,首先基于层级关系和类型创建键值对,然后根据父子关系构建树形结构,最终得到所需的结果。文章提供了示例代码,并针对层级编码的唯一性提出了建议。
扁平数组转树形结构:基于点符号和类型属性
在数据处理中,我们经常会遇到需要将扁平数组转换为树形结构的情况。例如,一个扁平数组可能包含具有层级关系的分类数据,每个元素都有一个表示层级关系的字符串(例如 “1.2.3”)和一个表示类型的属性(例如 “category” 或 “item”)。本文将介绍一种基于点符号和 “type” 属性将这种扁平数组转换为树形结构的方法。
算法思路
核心思想是首先将扁平数组转换为一个以层级关系为键的关联数组,然后遍历这个关联数组,根据层级关系找到每个节点的父节点,并将该节点添加到父节点的子节点列表中。如果一个节点没有父节点,则将其添加到结果数组中,作为树的根节点。
代码实现
以下是一个 PHP 示例代码,演示了如何实现这个算法:
<?php
function flatToTree(array $array): array
{
$keyed = [];
$result = [];
// 假设层级编号在不同类型中不是唯一的,则按类型和层级组合键
foreach ($array as $item) {
$keyed[$item["type"] . $item["hierarchy"]] = $item;
}
foreach ($keyed as &$item) {
// 使用 pathinfo 获取父节点的层级关系
$parent = pathinfo($item["hierarchy"], PATHINFO_FILENAME);
// 如果父节点与当前节点相同,则说明当前节点是根节点
if ($parent == $item["hierarchy"]) {
$result[] = &$item;
} else {
// 将当前节点添加到父节点的子节点列表中
$keyed["category_label$parent"]["children"][] = &$item;
}
}
return $result;
}
// 示例数据
$array = [
[
"hierarchy" => "1",
"title" => "Fruits",
"type" => "category_label"
],
[
"hierarchy" => "1.1",
"title" => "Citruses",
"type" => "category_label"
],
[
"hierarchy" => "1.1.1",
"title" => "Orange",
"type" => "item"
],
[
"hierarchy" => "1.1",
"title" => "Mango",
"type" => "item"
],
[
"hierarchy" => "1.2",
"title" => "Grape",
"type" => "item"
]
];
// 调用函数
$tree = flatToTree($array);
// 打印结果 (方便调试)
echo "<pre class="brush:php;toolbar:false">";
print_r($tree);
echo "
登录后复制
“;
?>
代码解释:
- flatToTree(array $array): array 函数接收一个扁平数组作为输入,并返回一个树形数组。
- $keyed = []; 和 $result = []; 分别用于存储中间结果和最终结果。
- 第一个 foreach 循环遍历输入数组,并使用 type 和 hierarchy 组合成键,将每个元素存储到 $keyed 数组中。
- 第二个 foreach 循环遍历 $keyed 数组,使用 pathinfo 函数获取每个节点的父节点的层级关系。
- 如果一个节点的父节点与其自身相同,则说明该节点是根节点,将其添加到 $result 数组中。
- 否则,根据父节点的层级关系从 $keyed 数组中找到父节点,并将当前节点添加到父节点的 children 列表中。
- 最后,返回 $result 数组,该数组包含了树形结构的根节点。
注意事项
- 层级编码的唯一性: 上述代码假设层级编号在不同类型中不是唯一的。如果层级编号在所有类型中都是唯一的,可以简化代码,直接使用层级关系作为键。 例如:$keyed[$item[“hierarchy”]] = $item; 并且 $keyed[$parent][“children”][] =& $item;
- 引用传递: 代码中使用 & 符号进行引用传递,以确保子节点的修改能够反映到父节点上。
- 错误处理: 在实际应用中,需要添加错误处理机制,例如检查父节点是否存在,以及处理层级关系错误的情况。
- 性能优化: 对于大型数组,可以考虑使用更高效的数据结构和算法来优化性能。
总结
本文介绍了一种将扁平数组转换为树形结构的方法,该方法基于点符号表示的层级关系和 “type” 属性。通过示例代码和注意事项,希望能够帮助读者理解和应用这种方法。在实际应用中,需要根据具体情况进行调整和优化,以满足不同的需求。
以上就是将扁平数组转换为基于点符号和 "type" 属性的树形数组的详细内容,更多请关注php中文网其它相关文章!