根据父ID值将数组从一维转换为多维
我有一个代表多维数据的一维对象数组:
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迭代将您的平面从树转换为树?
您可以自行决定何时单击包含解决方案的链接。
以上是 根据父ID值将数组从一维转换为多维 的全部内容, 来源链接: utcz.com/qa/422377.html