php非递归无限级分类.

项目需要.递归无限级分类效率实在太低.理了半天思路写的.

分类越多效率越高.

/**
 * 单次循环返回无限极分类嵌套
 * @param array $data 操作的数组
 * @param string $columnPri 唯一键名,如果是表则是表的主键
 * @param string $columnPid 父ID键名
 * @return array
 */
function region_tree($data, $columnPri, $columnPid)
{
    define(‘__parent_id‘, $columnPid);
    define(‘__pri_id‘, $columnPri);
    if (empty($data)) {
        return array();
    }
    usort($data, function ($prev, $next) {
        return CStrCmp($prev[__parent_id],$next[__parent_id]);
    });

    foreach ($data as $value) {
        $parent_id = $value[__parent_id];
        $pri_id    = $value[__pri_id];
        if (isset(${$pri_id})) {
            $value[‘_data‘] = isset($value[‘_data‘]) ? array_merge($value[‘_data‘], ${$pri_id}) : ${$pri_id};
            unset(${$pri_id});
        }
        ${$parent_id}[] = $value;
    }
    unset($data, $key, $value, $columnPid, $columnPri, $pri_id);
    $dataArray = ${$parent_id}[0];
    return $dataArray;
}

/**
 * 无限递归关联函数
 * 兼容5.3-写的
 * @param $a
 * @param $b
 * @return int
 */
function CStrCmp($a, $b)
{
    if ($a == $b) return 0;
    return $a > $b ? -1 : 1;
}

下面是递归无限极分类函数

/**
 * 递归返回无限极分类嵌套
 * @param $data 操作的数组
 * @param int $pid 一级PID的值
 * @param string $fieldPri 唯一键名,如果是表则是表的主键
 * @param string $fieldPid 父ID键名
 * @return array
 */
function channelLevel($data, $pid = 0, $fieldPri = ‘cid‘, $fieldPid = ‘pid‘)
{
    if (empty($data)) {
        return array();
    }
    $arr = array();
    foreach ($data as $v) {
        if ($v[$fieldPid] == $pid) {
            $arr[$v[$fieldPri]]           = $v;
            $arr[$v[$fieldPri]]["region"] = channelLevel($data, $v[$fieldPri], $fieldPri, $fieldPid);
        }
    }
    return $arr;
}
时间: 2024-08-09 14:22:08

php非递归无限级分类.的相关文章

php 非递归实现分类树

本文实例讲述了php通过前序遍历树实现无需递归的无限极分类.分享给大家供大家参考.具体如下: 大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限极分类,在大数据量实现树状层级结构的时候效率更高. sql代码如下: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(50) NOT NULL, `lft` i

php 无限级分类 递归+sort排序 和 非递归

1 先总结非递归 数据表: id name pid path 1 php 0 0 2 mysql 0 0 3 linux 0 0 4 php-基本语法 1 0-1 5 linux-磁盘分区 3 0-3 1 <?php 2 3 $navArr = [ 4 [ 5 'name'=>'php', 6 'id'=>1, 7 'pid'=>0, 8 'path'=>'0', 9 'sort'=>'2', 10 11 ], 12 [ 13 'name'=>'php-基础',

PHP无限级分类实现(递归+非递归)

<?php /** * Created by PhpStorm. * User: qishou * Date: 15-8-2 * Time: 上午12:00 */ //准备数组,代替从数据库中检索出的数据(共有三个必须字段id,name,pid) header("content-type:text/html;charset=utf-8"); $categories = array( array('id'=>1,'name'=>'电脑','pid'=>0), ar

(实用篇)PHP递归实现无限级分类

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据. 首先

PHP无限级分类-递归(不推荐)

[http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义

PHP不使用递归的无限级分类

不用递归实现无限级分类,简单测试了下性能比递归稍好一点点点,但写得太复杂了,还是递归简单方便点 代码: <?php $list = array( array('id'=>1, 'pid'=>0, 'deep'=>0, 'name'=>'test1'), array('id'=>2, 'pid'=>1, 'deep'=>1, 'name'=>'test2'), array('id'=>3, 'pid'=>0, 'deep'=>0, 'n

PHP迭代与递归实现无限级分类

无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳. 1.循环迭代实现 1 $arr = [ 2 1=>['id'=>1,'name'=>'父1','father'=>NULL], 3 2=>['id'=>2,'name'=>'父2','father'=>NULL], 4 3=>['id'=>3,'name'=>'父3','father'=>NULL], 5 4=>['id'=>4,'name'=&g

PHP无限级分类的实现(不使用递归)

1.实现原理 2.数据结构 3.输出ul列表形式 4.输出option列表形式 5. 查找某一分类的所有子类 6. 查找某一分类的所有父类 7. 相关函数 无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在<无限级分类实现思路>一文中介绍了几种常见的实现方法,各有利弊.其中“改进前序遍历树”数据结构,便于输出和查询,但是在移动分类和常规理解上有些

PHP递归实现无限级分类

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据. My