/**
* 将形如['ID'=>['ID','Name','ParentID','NLevel']]的数据重新组装成树状结构
* 会保留数据中的其他结构
* @param type $treeData
* @param type $depth
* @return array ['IndexTree'=>对树上每个节点的索引(指针->包含各个节点的子树),'Tree'=>树]
* 也就是两个成员是共享内存的,改了一个另一个也会受影响!
*/
function TreeArrayCreate($treeData,$ChildrenKey='Children',$IDKey = 'ID',$ParentKey='ParentID',$NLevelKey='ParentID')
{
//按照NLevel做一次降序排列,并保持键名
//等价于orderBy $NLevelKey,$IDKey ASC
uasort($treeData, function($a, $b)use($IDKey,$NLevelKey)
{
if ($a[$NLevelKey] == $b[$NLevelKey])
{
if($a[$IDKey]==$b[$IDKey])
return 0;
else
{
return ($a[$IDKey] < $b[$IDKey]) ? -1 : 1;
}
}
return ($a[$NLevelKey] < $b[$NLevelKey]) ? -1 : 1;
});
//以$treeData作为$root的全节点索引表,重构树结构
$root = [];
foreach ($treeData as $key => $val)
{
if ($val[$ParentKey] > 0)
{
if (isset($treeData[$val[$ParentKey]]))
$treeData[$val[$ParentKey]][$ChildrenKey][] = &$treeData[$key];
}
elseif ($val[$ParentKey] == 0)
{
$root[] = &$treeData[$key];
}
}
return ['IndexTree' => &$treeData, 'Tree' => &$root];
}
树处理php
最新推荐文章于 2022-07-16 16:53:36 发布