PHP实现无限分类

在很多地方我们都需要用到无限分类,今天给大家简单的介绍一下关于PHP实现无限分类的几种方式。

递归方式

这种方式也是大家比较常用的一种方式,先来看一下主要的表结构。

id: 自增id name: 分类名称 parent_id: 父类id,顶级类值为0 sort: 排序值

代码部分:

<?php

	/**
     * @param list array 二维数组
     * @param pid int 父级编号
     * @parma level int 层级
     * @param html string html输出前缀
     */

	function tree($list, $pid = 0, $level = 1, $html = ' -- '){
		$tree = array();
        foreach ($list as $v) {
            if ($v['parent_id'] == $pid) {
                $v['sort'] = $level;
                $v['html'] = '|' . str_repeat($html, $level);
                $tree[] = $v;
                $tree = array_merge($tree, tree($list, $v['id'], $level + 1, $html));
            }
        }
        return $tree;
	}
?>

引用方式

其实PHP引用是一个不错的东东,可以使用引用来组织数据。

<?php
	/**
     * @param $data 需要处理的数组
     */
    function tree($data){
        $items = array();
        foreach ($data as $val) {
            $items[$val['id']] = $val;
        }
        unset($data);
        $tree = array();
        foreach ($items as $item) {
            if (isset($items[$item['parent_id']])) {
                $items[$item['parent_id']]['son'][] = &$items[$item['id']];
            } else {
                $tree[] = &$items[$item['id']];
            }
        }
        return $tree;
    }
?>

基于左右编码值

这种方式的关键点在于数据库的设计,主要表结构如下:

id: 自增id name: 分类名称 lft: 左值 rgt: 右值 level: 层级数

具体看一个比较形象的例子,如水果的分类

Food : 食物 Fruit : 水果 Red : 红色 Cherry: 樱桃 Yellow: 黄色 Banana: 香蕉 Meat : 肉类 Beef : 牛肉 Pork : 猪肉

把上面的分类,组织成一个二叉树的结构,并在每个分类的左右标值,如下图:

 

分类图

从图中来看,我们要得到水果下面的所有分类,那么只需要用到下面的SQL语句:

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;

通过下面代码便可很快的输出树形结构

<?php
	function tree($root){
		// 得到根节点的左右值
	    $result = mysql_query("
	        SELECT lft, rgt
	        FROM tree
	        WHERE name = '" . $root . "'
	        ;"
	    );
	    $row = mysql_fetch_array($result);
	    // 准备一个空的右值堆栈
	    $right = array();
	    // 获得根基点的所有子孙节点
	    $result = mysql_query("
	        SELECT name, lft, rgt
	        FROM tree
	        WHERE lft BETWEEN '" . $row['lft'] . "' AND '" . $row['rgt'] ."'
	        ORDER BY lft ASC
	        ;"
	    );
	    // 显示每一行
	    while ($row = mysql_fetch_array($result)) {
	        // only check stack if there is one
	        if (count($right) > 0) {
	            // 检查我们是否应该将节点移出堆栈
	            while ($right[count($right) - 1] < $row['rgt']) {
	                array_pop($right);
	            }
	        }
	        // 缩进显示节点的名称
	        echo str_repeat('  ',count($right)) . $row['name'] . "\n";
	        // 将这个节点加入到堆栈中
	        $right[] = $row['rgt'];
	    }
	}
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现无限分类的方法有多种,其中包括递归和非递归两种方式。下面分别介绍一下这两种方法的实现。 1. 递归实现无限分类 递归实现无限分类的方法是将分类数据作为一个树形结构来处理。具体实现步骤如下: (1)从数据库中获取所有分类数据,并按照父子关系组织为树形结构。 (2)遍历树形结构,输出每个分类的名称以及子分类的名称。 (3)对于每个子分类,重复步骤(2)。 下面是一个递归实现无限分类的示例代码: ```php function getCategoryTree($parent_id = 0, $level = 0) { $categories = getCategoryByParentId($parent_id); if (count($categories) > 0) { foreach ($categories as $category) { echo str_repeat('-', $level) . $category['name'] . '<br>'; getCategoryTree($category['id'], $level + 1); } } } function getCategoryByParentId($parent_id) { // 从数据库中获取 $parent_id 的所有子分类数据 // ... return $categories; } // 输出所有分类 getCategoryTree(); ``` 2. 非递归实现无限分类 非递归实现无限分类的方法是使用堆栈(或队列)来处理分类数据。具体实现步骤如下: (1)从数据库中获取所有分类数据,并按照父子关系组织为一个数组。 (2)将根分类(即 parent_id 为 0 的分类)入栈。 (3)从堆栈中取出一个分类,并输出该分类的名称。 (4)将该分类的所有子分类依次入栈。 (5)重复步骤(3)和(4),直到堆栈为空。 下面是一个非递归实现无限分类的示例代码: ```php function getCategoryTree() { $categories = getCategoryByParentId(0); $stack = array(); foreach ($categories as $category) { array_push($stack, array('category' => $category, 'level' => 0)); } while (count($stack) > 0) { $current = array_pop($stack); echo str_repeat('-', $current['level']) . $current['category']['name'] . '<br>'; $children = getCategoryByParentId($current['category']['id']); foreach ($children as $child) { array_push($stack, array('category' => $child, 'level' => $current['level'] + 1)); } } } function getCategoryByParentId($parent_id) { // 从数据库中获取 $parent_id 的所有子分类数据 // ... return $categories; } // 输出所有分类 getCategoryTree(); ``` 以上就是php实现无限分类的两种方法。从实现难度和效率上来看,递归方法更简单,但对于数据量较大的情况,可能会导致栈溢出。非递归方法虽然复杂一些,但可以处理更大的数据量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值