通过&引用实现:
/**
* 树形迭代器
*
* @param array $data 数据源
* @param array $result 结果
* @param array $parent 父级
* @param callable|null $mapFun 数据处理器
* @param $optoins ['keyField' => 'id', 'parentField' => 'parent', 'childrenField' => 'children']
* @return void
*/
public static function treeIterator($data, &$result = [], $parent = null, $mapFun = null, $optoins = [])
{
$_default = array_merge(['keyField' => 'id', 'parentField' => 'parent', 'childrenField' => 'children'], $optoins);
$isTop = empty($result);
foreach ($data as $index => &$datum) {
unset($data[$index]);
if ($parent == $datum[$_default['parentField']]) {
if ($isTop) {
$result[] = $datum;
$currentDatum = &$result[count($result) - 1];
} else {
$result[$_default['childrenField']][] = $datum;
$currentDatum = &$result[$_default['childrenField']][count($result[$_default['childrenField']]) - 1];
}
self::treeIterator($data, $currentDatum, $datum[$_default['keyField']], $mapFun, $_default);
if (is_callable($mapFun)) {
$mapFun($currentDatum);
}
}
}
}
通过数组返回实现
function buildTree($parentId, $categories) {
$tree = array();
foreach ($categories as $category) {
if ($category['parent_id'] == $parentId) {
$children = buildTree($category['id'], $categories);
if ($children) {
$category['children'] = $children;
}
$tree[] = $category;
}
}
return $tree;
}
数组方式实现也很简单,根据自己的需求微调参数即可。