PHP无限级分类(递归版,非递归版)

构造无限集分类(非递归版)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值