构造无限集分类(非递归版)
if(!function_exists('generateTree')){
/**
* @param array $items 源数组列表
* @param string $primaryKey 数据主键名(codeID)
* @param string $relationKey 父子关系字段名 (pcodeid)
* @param string $recursiveKey 构造无限集分类属性名
* @author LJ
* @date 2020-10-13
* @return array|boolean
* 构造无限集分类
*/
function generateTree($items , $primaryKey, $relationKey, $recursiveKey = 'child')
{
if(empty($items) || empty($primaryKey) || empty($primaryKey) || !is_array($items))
{
return false;
}
$tree = array();
if (empty($primaryKey) === false) {
$items = array_column($items, null, $primaryKey);
}
foreach ($items as $k => $item) {
if (isset($items[$item[$relationKey]])) {
$items[$item[$relationKey]][$recursiveKey][] = &$items[$k];
} else {
$tree[] = &$items[$k];
}
}
return $tree;
}
}
无限极分类(递归版)
/**
* 递归无限级分类【先序遍历算】,获取任意节点下所有子孩子 获取子节点
* @param array $arrCat 待排序的数组
* @param int $parent_id 父级节点
* @param int $level 层级数
* @param bool $isInit 是否初始化$arrTree变量 false-否 true-是
* @param bool $clear 是否清除静态变量值 true-是 false-否(在循环中调用无限极分类使用)
* @return array $arrTree 排序后的数组
*/
function getMenuTree($arrCat, $parent_id = 0, $level = 0, $isInit = false, $clear = false)
{
if ($isInit == false) {
$isInit = true;
$arrTree = array();
unset($arrTree);
}
static $arrTree = array(); //使用static代替global
if ($clear) {
$arrTree = null;
static $arrTree = array();
}
if (empty($arrCat)) return FALSE;
$level++;
foreach ($arrCat as $key => $value) {
if ($value['pcodeid'] == $parent_id) {
$value['level'] = $level;
$arrTree[] = $value;
unset($arrCat[$key]); //注销当前节点数据,减少已无用的遍历
getMenuTree($arrCat, $value['codeid'], $level, $isInit);
}
}
return $arrTree;
}