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

yizhihongxing

以下是「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实现搜索一维数组元素并删除二维数组对应元素的方法

    实现搜索一维数组元素并删除二维数组对应元素的方法,可以分为以下几个步骤: 定义一个一维数组,存储需要搜索的元素; 定义一个二维数组,存储需要删除对应元素的数组; 使用foreach循环遍历二维数组,对每个子数组使用array_search函数搜索一维数组中是否存在对应元素; 如果存在对应元素,则使用unset函数删除该子数组; 循环结束后,获得删除后的二维数…

    PHP 2023年5月26日
    00
  • PHP调用其他文件中的类

    PHP调用其他文件中的类,需要使用对象实例化及命名空间的概念。以下是调用其他文件中的类的完整攻略: 导入类文件及命名空间 在使用其他文件中的类时,需要先导入类文件并指定命名空间。例如有一个名为Person.php的类文件,命名空间为App\Models,则需要在使用该类的文件中先导入该文件并指定命名空间: use App\Models\Person; 在导入…

    PHP 2023年5月26日
    00
  • 微信小程序码如何生成 微信小程序码生成方法攻略教程大全

    微信小程序码如何生成:攻略教程大全 微信小程序码是一种将小程序主页或特定页面整合到一张二维码中的方式。这种二维码能够通过扫描的方式访问你的小程序,非常便于推广和分享。 下面我们将详细介绍如何生成微信小程序码,并提供两条示例说明。 生成微信小程序码的方法 在生成小程序码之前,需要先确定你要生成哪一种类型的小程序码。微信小程序官方提供了三种小程序码: 通过小程序…

    PHP 2023年5月23日
    00
  • php返回字符串中所有单词的方法

    要返回字符串中所有单词的方法,可以使用正则表达式和 PHP 的 preg_match_all 函数。 下面是具体的步骤: 1. 使用 preg_match_all 函数和正则表达式匹配所有单词 $string = "Hello world! This is a test string."; preg_match_all("/\b…

    PHP 2023年5月26日
    00
  • PHP获取当前系统时间的方法小结

    以下是“PHP获取当前系统时间的方法小结”的完整攻略。 标准方式获取系统时间 通过以下代码可以获取当前系统时间: date_default_timezone_set(‘Asia/Shanghai’); echo date(‘Y-m-d H:i:s’); 其中date_default_timezone_set函数可以设置当前系统所在时区,其参数为时区字符串。d…

    PHP 2023年5月30日
    00
  • Eclipse PHPEclipse 配置的具体步骤

    Eclipse是一个优秀的开发工具,它提供了许多插件来支持不同的编程语言。在使用Eclipse开发PHP项目时,可以使用PHPEclipse插件来增强其PHP开发支持。 以下是Eclipse PHPEclipse配置的具体步骤: 步骤一:安装Eclipse 如果您已经安装了Eclipse,请跳过此步骤。 首先,您需要下载并安装Eclipse软件。您可以通过以…

    PHP 2023年5月27日
    00
  • 如何在PHP中生成随机数

    生成随机数在很多Web应用程序中都是至关重要的。PHP提供了多种生成随机数的函数。下面我们来详细讲解如何在PHP中生成随机数。 PHP函数rand() PHP内置的rand()函数可以生成伪随机整数。rand()的形式如下: rand($min, $max); 其中,$min是最小值,$max是最大值。如果只传递一个参数,则默认最小值为0,最大值为rand_…

    PHP 2023年5月26日
    00
  • PHP实现用户认证及管理完全源码

    PHP实现用户认证及管理完全源码 用户认证和管理是web开发中经常涉及的重要部分,因为每个网站都需要用户注册和登录功能,在本文中,我们将介绍如何使用PHP实现用户认证及管理功能,并提供完整源码及示例说明。 准备工作 在开始编写代码之前,我们需要准备一些东西。 数据库 我们需要创建一个数据库来存储用户的信息,我们可以使用MySQL或者其他支持的数据库。在这里,…

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