PHP实现无限极分类生成分类树的方法

以下是「PHP实现无限极分类生成分类树的方法」的完整攻略。

什么是无限极分类

无限极分类是指分类下还可再细分出同级别的子分类,进而无限循环有无限级别的分类。

举个例子来说,假设“商品分类”有如下结构:

  • 服饰
  • 男装
    • 衬衫
    • 单色衬衫
    • 领结衬衫
    • 西装
    • T恤
  • 女装
    • 连衣裙
    • 花裤子
  • 食品
  • 奶类
  • 水果
    • 苹果
    • 香蕉

以上结构可视为无限极分类。现在需要写 PHP 代码来将这样一份分类转化为在浏览器中显示的分类树。

无限极分类实现方法

方法一:递归实现

递归是实现无限极分类的最常用方法,具体方式是将所需的无限分类数据在一次循环中转化为了树形数据。该方法可在无限级别分类下的任意类别下添加子类别。

/**
 * 递归方法:生成分类树
 * @param $categoryArr  目标分类数组
 * @param $parentId     当前分类的父级ID
 * @return array        以多维数组形式返回分类树
 */
function buildCategoryTree($categoryArr, $parentId = 0) {
    $tree = array();
    foreach($categoryArr as $key => $category) {
        if ($category['parent_id'] == $parentId) {
            $tree[] = array(
                'id' => $category['id'],
                'name' => $category['name'],
                'child' => buildCategoryTree($categoryArr, $category['id']),
            );
        }
    }
    return $tree;
}

该方法通过一个递归函数 buildCategoryTree,实现了将当前分类及其子分类列表渲染到 HTML 中。这里传入的 $categoryArr 为目标分类数组,$parentId 为当前分类的父级ID,初始默认设为0。

方法二:使用迭代器实现

PHP中的 Iterator 接口提供了 Iterator 对象,该对象实现对迭代器对象的一页一页或单个单个管理。

该方法与递归方法类似,通常使用无限极分类数组重排的方式生成一个树形数组。由于迭代器特别适用于处理较大的数据集,因此该方法可保持代码的封装性,并且速度较快。

以下是迭代器实现的分类树方法部分代码:

/**
 * 迭代器实现方法:将分类数组转换成分类树数组
 * @param array $data 原始分类数组
 * @return array      以多维数组形式返回分类树
 */
function buildTree(array $data) {
    $map = array();
    $tree = array();
    foreach ($data as &$vo) {
        $map[$vo['id']] = &$vo;
        $map[$vo['id']]['child'] = array();                    
    }
    unset($vo);

    foreach ($data as &$vo) {
        $parent = &$map[$vo['parent_id']];
        empty($parent) ? ($tree[] = &$vo) : ($parent['child'][] = &$vo);
    }
    unset($vo);
    unset($map);

    return $tree;
}

示例说明

以下以“商品分类”为例演示两条无限极分类实现方法。

示例一:递归实现

假设“商品分类”表包含如下数据:

id name parent_id
1 服饰 0
2 男装 1
3 衬衫 2
4 西装 2
5 女装 1
6 电器 0
7 冰箱 6
8 洗衣机 6

传入原始分类数据,执行递归分类,得到以下数据输出:

$data = array(
    array('id'=>1,'name'=>'服饰','parent_id'=>0),
    array('id'=>2,'name'=>'男装','parent_id'=>1),
    array('id'=>3,'name'=>'衬衫','parent_id'=>2),
    array('id'=>4,'name'=>'西装','parent_id'=>2),
    array('id'=>5,'name'=>'女装','parent_id'=>1),
    array('id'=>6,'name'=>'电器','parent_id'=>0),
    array('id'=>7,'name'=>'冰箱','parent_id'=>6),
    array('id'=>8,'name'=>'洗衣机','parent_id'=>6),
);
$treeList = buildCategoryTree($data);
echo '<pre>';
print_r($treeList);
echo '</pre>';

输出结果:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 服饰
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [name] => 男装
                            [child] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 3
                                            [name] => 衬衫
                                            [child] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 4
                                                            [name] => 西装
                                                            [child] => Array
                                                                (
                                                                )
                                                        )
                                                )
                                        )
                                    [1] => Array
                                        (
                                            [id] => 4
                                            [name] => 西装
                                            [child] => Array
                                                (
                                                )
                                        )
                                )
                        )
                    [1] => Array
                        (
                            [id] => 5
                            [name] => 女装
                            [child] => Array
                                (
                                )
                        )
                )
        )
    [1] => Array
        (
            [id] => 6
            [name] => 电器
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 7
                            [name] => 冰箱
                            [child] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 8
                            [name] => 洗衣机
                            [child] => Array
                                (
                                )
                        )
                )
        )
)

示例二:使用迭代器实现

假设我们有一个函数 getList 可以根据传入的分类ID查询该分类下的所有子分类以及子分类的子分类。

/**
 * 获取商品分类信息
 */
function getList($id){
    $map['parent_id'] = $id;
    return M('GoodsCategory')->where($map)->select();
}

接下来调用 buildTree 函数即可实现无限极分类生成分类树的功能。

/**
 * 利用迭代器,生成分类树
 */
function buildTree($parentId = 0){
    $data = getList($parentId);
    $tree = $this->buildTreeByList($data);
    foreach ($tree as &$item) {
        $item['children'] = $this->buildTree($item['id']);
        if (empty($item['children'])) {
            unset($item['children']);
        }
    }
    return $tree;
}

以上是“PHP实现无限极分类生成分类树的方法”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现无限极分类生成分类树的方法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 浅谈php中的循环while、do…while、for、foreach四种循环

    下面是 “浅谈php中的循环while、do…while、for、foreach四种循环” 的攻略: 1. while 循环 while循环是php中最基本的循环控制结构。while循环会在每次循环开始之前检查它的循环条件,只要条件为真就会重复执行循环体中的代码。例如: $i = 1; while ($i <= 10) { echo $i; $i+…

    PHP 2023年5月26日
    00
  • php使用explode()函数将字符串拆分成数组的方法

    当我们需要将一个字符串按照特定的字符或者字符串进行拆分时,PHP的内置函数explode()可以很好的满足我们的需求。下面是介绍如何使用explode()函数将字符串拆分成数组的完整攻略。 1. 函数定义 explode()函数用于将一个字符串分割成数组。其语法为: array explode ( string $delimiter , string $st…

    PHP 2023年5月26日
    00
  • PHP程序级守护进程的实现与优化的使用概述

    PHP程序级守护进程的实现与优化的使用概述 什么是PHP程序级守护进程 PHP程序级守护进程是指在PHP中通过编写代码来创建一种特殊类型的程序,该程序能够在后台持续运行,并且在启动后不会退出,直到收到指定的停止信号才会退出。这种类型的程序被称为守护进程,它常常用于长时间运行的任务,如定时任务、消息队列等。 实现PHP程序级守护进程的方法 使用pcntl扩展库…

    PHP 2023年5月23日
    00
  • [原创]php中&&和||逻辑运算符的高级简写(缩写条件)用法由浅入深讲解

    当前回答已经使用了标准的Markdown格式文本,但可能由于技术问题导致格式出现了问题。以下是重新排版后的回答: 基础知识 在使用PHP中的逻辑运算符时,需要掌握一些基础知识,包括逻辑运算符的基本用法、逻辑运算符的优先级、逻辑运算符的短路特性等。以下是一些常见的基础知识: 逻辑运算符的基本用法,包括&&、||、!等。 逻辑运算符的优先级,包括…

    PHP 2023年5月12日
    00
  • 详解PHP 二维数组排序保持键名不变

    当需要按照某种指标对 PHP 二维数组进行排序时,并保持键名不变,我们可以使用PHP中的uasort()函数。 uasort()函数可以对数组进行排序,同时保持键名不变。我们可以在回调函数中自定义排序规则来满足我们的需求。此外,该函数可以保证键名与键值的关系不会改变。 以下是使用uasort()函数对二维数组按照值进行排序的示例代码: $users = ar…

    PHP 2023年5月26日
    00
  • php 字符过滤类,用于过滤各类用户输入的数据

    一、简介 PHP 字符过滤类可以用来处理和清理用户输入的数据,以避免您的 PHP 应用程序受到恶意攻击和注入攻击。这个类可以过滤输入和输出字符串,选择哪些字符必须删除和哪些字符必须保留,包括 HTML 标记,SQL 代码,特殊字符等。 二、安装和使用 下载并解压缩字符过滤类的压缩包至您的 PHP 应用程序所在的目录; 创建一个 PHP 文件并进行如下设置: …

    PHP 2023年5月26日
    00
  • 在线竞拍系统的PHP实现框架(一)

    下面我就详细讲解一下“在线竞拍系统的PHP实现框架(一)”的完整攻略。 引言 竞拍系统是一个常见的业务场景,在线竞拍系统的实现则需要考虑到多方面的问题,如安全性、数据一致性、并发性等。本文旨在介绍一个基于PHP实现的在线竞拍系统框架,可供读者参考和使用。 开发环境 本系统的开发环境为: 操作系统:Windows/Linux Web服务器:Apache/Ngi…

    PHP 2023年5月24日
    00
  • PHP几个数学计算的内部函数学习整理

    PHP数学计算函数 PHP提供了很多内部函数来进行数学计算,包括基本的加减乘除,以及三角函数、求幂、取余等高级数学运算。下面将详细介绍几个常用的PHP数学计算函数和用法。 abs — 绝对值 abs()函数可以用来获取数字的绝对值: echo abs(-4.2); // output: 4.2 round — 四舍五入到指定精度 round()函数可以用来将…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部