PHP生成树状

代码片段


/**
 * 数据处理
 * Class TreeUtil
 * @package app\util
 * @author  2066362155@qq.com
 */
class TreeUtil
{

    /**
     * [getParents 获取分类id所有父级分类]
     * @param  [type] $list [2维数组]
     * @param  [type] $id   [指定id]
     * @param  string $pk [主键标识]
     * @param  string $pid [父级标识]
     * @return [array]      [父类数组]
     */
    public static function getParents($list, $id, $pk = 'id', $pid = 'parentId')
    {

        $tree = array();
        foreach ($list as $v) {
            if ($v[$pk] == $id) {
                $tree[] = $v;
                $tree   = array_merge(self::getParents($list, $v[$pid]), $tree);
            }
        }

        return $tree;
    }

    /**
     * [getParentsId 获取分类id所有父级分类id]
     * @param  [type] $list [2维数组]
     * @param  [type] $id   [指定id]
     * @param  string $pk [主键标识]
     * @param  string $pid [父级标识]
     * @return [array]      [父类数组]
     */
    public static function getParentsId($list, $id, $pk = 'id', $pid = 'parentId')
    {

        $tree = array();
        foreach ($list as $v) {
            if ($v[$pk] == $id) {
                $tree[] = $v[$pk];
                $tree   = array_merge(self::getParentsId($list, $v[$pid], $pk, $pid), $tree);
            }
        }

        return $tree;
    }

    /**
     * [listToTreeOne 格式化分类,生成一维数组 ,根据path 属性]
     * @param  [type]  $list   [数组]
     * @param  integer $root [指定根节点]
     * @param  string $prefix [前缀标识]
     * @param  string $pk [主键标识]
     * @param  string $pid [父级标识]
     * @param  string $html [前缀字符]
     * @return [type]          [description]
     */
    public static function listToTreeOne($list, $root = 0, $prefix = '', $pk = 'id', $pid = 'parentId', $html = 'html')
    {

        $tree = array();
        foreach ($list as $v) {
            if ($v[$pid] == $root) {
                if ($v[$pid] == 0) {
                    $level = 0;
                } else {
                    $level = count(self::getParentsId($list, $v[$pk], $pk, $pid));
                }

                $v[$html] = str_repeat("      ", $level);
                $v[$html] = $v[$html] ? ($v[$html] . $prefix) : $v[$html];
                $tree[]   = $v;
                $level++;
                $tree = array_merge($tree, self::listToTreeOne($list, $v[$pk], $prefix, $pk, $pid, $html));
            }
        }

        return $tree;
    }


    /**
     * [listToTreeMulti 格式化分类--生成多维数组 ,子数组放在child 属性中]
     * @param  [type]  $list  [数组]
     * @param  integer $root [指定根节点]
     * @param  string $pk [主键标识]
     * @param  string $pid [父级标识]
     * @param  string $child [子级标识]
     * @return [type]         [description]
     */
    public static function listToTreeMulti($list, $root = 0, $pk = 'id', $pid = 'parentId', $child = 'child')
    {

        $tree = array();
        foreach ($list as $v) {
            if ($v[$pid] == $root) {
                $v[$child] = self::listToTreeMulti($list, $v[$pk], $pk, $pid, $child);
                $tree[]    = $v;
            }
        }

        return $tree;
    }


    /**
     * [list_to_tree 格式化分类,生成多维数组的树]
     * @param  [type]  $list  [数组]
     * @param  integer $root [指定根节点]
     * @param  string $pk [主键标识]
     * @param  string $pid [父级标识]
     * @param  string $child [子级标识]
     * @return [type]         [description]
     */
    public static function list_to_tree($list, $root = 0, $pk = 'id', $pid = 'parentId', $child = 'child')
    {
        // 创建Tree
        $tree = array();
        if (is_array($list)) {
            // 创建基于主键的数组引用
            $refer = array();
            foreach ($list as $key => $data) {
                $refer[$data[$pk]] =& $list[$key];
            }

            foreach ($list as $key => $data) {
                // 判断是否存在parent
                $parentId = $data[$pid];
                if ($root == $parentId) {
                    $tree[] =& $list[$key];
                } else {
                    if (isset($refer[$parentId])) {
                        $parent           =& $refer[$parentId];
                        $parent[$child][] =& $list[$key];
                    }
                }
            }
        }

        return $tree;
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值