当前位置:  编程技术>php
本页文章导读:
    ▪提高php无限分类查询的效率(使用数组和递归)      数据库:fruit 三个字段:id , parentid ,name 如何查询完所有分类(包括父分类和子分类)? 普遍的方法: 先查询最顶级的分类,select * from fruit where parentid=0. 得到顶级分类的id,然后用递.........
    ▪php将对象转换为数组函数的代码      php将对象转换为数组函数的代码,使用到了递归,返回一个层次分明的数组对象。 有需要的朋友可以参考下。   代码如下: <?php /** * 对象转换为数组 * link:www. * date:2013/2/22 */ functio.........
    ▪一个无限循环数组的例子(递归)      一个无限循环数组的例子,使用了递归,有需要的朋友可以参考下。   代码如下: <?php /** * Author : GuoWangYunYan * QQ : 279861795 * Date : 2011-6-23 * link:www.jbuxe.com */ //设置编码 header('Content-ty.........

[1]提高php无限分类查询的效率(使用数组和递归)
    来源: 互联网  发布时间: 2013-12-24

数据库:fruit
三个字段:id , parentid ,name
如何查询完所有分类(包括父分类和子分类)?
普遍的方法:
先查询最顶级的分类,select * from fruit where parentid=0.
得到顶级分类的id,然后用递归的方法,根据父id查询子分类。
如此一来便会查询很多次数据库,而且分类越多,查询的次数增长得越快。

设想要是有10个人同时查询所有分类,而这个分类有4层,每层有10个子分类,估计你的数据库要哭了。

要文为大家介绍一个很实用的方法:把本来数据库做的工作交给了程序处理,一次性查询完所有分类。
类:Tree
 

代码如下:
<?php
class Tree {
  
 /**
  * 从数据库查询出的所有分类信息
  * @var array
  * by:www.
  */
 var $arr;
/**
 * 如下格式
 *  var $arr = array(
 1 => array(‘id’=>’1′,’parentid’=>0,’name’=>’一级栏目一’),
 2 => array(‘id’=>’2′,’parentid’=>0,’name’=>’一级栏目二’),
 3 => array(‘id’=>’3′,’parentid’=>1,’name’=>’二级栏目一’),
 );*/
  
 /**
  * 输出结构
  * @var array
  */
 var $tree = array();
 /**
  * 树形递归的深度
  * @var int
  */
 var $deep = 1;
  
 /**
  * 生成树形的修饰符号
  * @var array
  */
 var $icon = array(‘│’,'├’,'└’);
 /**
  * 生成指定id的下级树形结构
  * @param int $rootid 要获取树形结构的id
  * @param string $add 递归中使用的前缀
  * @param bool $parent_end 标识上级分类是否是最后一个
  */
 function getTree($rootid = 0,$add = ”,$parent_end =true){
  $is_top = 1;
  $child_arr = $this->getChild($rootid);
  if(is_array($child_arr)){
   $cnt = count($child_arr);
   foreach($child_arr as $key => $child){
    $cid = $child['id'];
    $child_child = $this->getChild($cid);
    if($this->deep >1){
     if($is_top == 1 && $this->deep > 1){
      $space = $this->icon[1];
      if(!$parent_end)
      $add .=  $this->icon[0];
      else $add .= ‘&nbsp;&nbsp;’;
     }
  
     if($is_top == $cnt){
      $space = $this->icon[2];
      $parent_end = true;
     }else {
      $space = $this->icon[1];
      $parent_end = false;
     }
    }
    $this->tree[] = array(‘spacer’=>$add.$k.$space,
           ‘name’=>$child['name'],
           ‘id’=>$cid
    );
    $is_top++;
  
    $this->deep++;
    if($this->getChild($cid))
    $this->getTree($cid,$add,$parent_end);
    $this->deep–;
  
   }
  
  }
  return $this->tree;
 }
  
 /**
  * 获取下级分类数组
  * @param int $root
  */
 function getChild($root = 0){
  
  $a = $child = array();
  foreach($this->arr as $id=>$a){
   if($a['parentid'] == $root){
    $child[$a['id']] = $a;
   }
  }
  return $child?$child:false;
     
 }
 /**
  * 设置源数组
  * @param $arr
  */
 function setArr($arr = array()){
  $this->arr = $arr;
 }
}

通过一次查询把结构保存进一个数组,再数组进行递归运算,无疑极大的提高了程序运行效率。
代码的使用很简单:得到查询结构后setArr,直接调用getTree, 皆可以得到按照程序排序号并带有前缀修饰等信息的数组。通过foreach这个数组可以得到如下的树状列表:
水果
├香蕉
├苹果
│├红富士
│└海南苹果
└桃子
记住:网站开发过程中,多数的瓶颈在数据库,而非php代码。

您可能感兴趣的文章:

php无限分类的例子(仿淘宝商品分类)
php实现的无限分类(递归版本)的例子
使用php数组实现的无限分类(不使用数据库与用递归)
php写的一个递归实现无限分类生成下拉列表的函数

    
[2]php将对象转换为数组函数的代码
    来源: 互联网  发布时间: 2013-12-24

php将对象转换为数组函数的代码,使用到了递归,返回一个层次分明的数组对象。
有需要的朋友可以参考下。
 

代码如下:
<?php
/**
* 对象转换为数组
* link:www.
* date:2013/2/22
*/
function object_to_array($obj)
{
$_arr = is_object($obj) ? get_object_vars($obj) : $obj;
foreach ($_arr as $key => $val)
{
$val = (is_array($val) || is_object($val)) ? object_to_array($val) : $val;
$arr[$key] = $val;
}
return $arr;
}
?>

    
[3]一个无限循环数组的例子(递归)
    来源: 互联网  发布时间: 2013-12-24

一个无限循环数组的例子,使用了递归,有需要的朋友可以参考下。
 

代码如下:

<?php
/**
* Author : GuoWangYunYan
* QQ : 279861795
* Date : 2011-6-23
* link:www.jbuxe.com
*/
//设置编码
header('Content-type: text/html; charset=utf-8');
//比较变态的用了个五维数组
$a = array(
  'AAAAAA'  =>  array(
        'aaaaaa' => array(
                 '111111',
                 '222222',
                 '333333'
        ),
        'bbbbbb'  => array(
                  '111111',
                 '222222',
                 '333333'
        ),
        'cccccc'  => array(
                  '111111',
                  '222222',
                  '333333'
        ),                    
  ),
  'BBBBBB'  =>   array(
        'aaaaaa' => array(
                  '111111',
                  '222222',
                  '333333'
        ),
        'bbbbbb'=> array(
                  '111111',
                  '222222',
                  '333333'
        ),
        'cccccc'=> array(
                  '111111',
                  '222222',
                  '333333'
        ),
  ),
  'CCCCCC'  => array(
        'aaaaaa'=> array(
                  '111111',
                  '222222',
                  '333333'
        ),
        'bbbbbb'=> array(
                  '111111',
                  '222222',
                  '333333'
        ),
        'cccccc' => array(
                  '111111'=>array('44','55','66'),
                  '222222'=>array('44','55','66'),
                  '333333'=>array(
                          '44'=>array('77','88','99'),
                          '55'=>array('77','88','99'),
                          '66'=>array('77','88','99'),
      ),
    ),
  ),
);

//执行函数
 fun($a);
   
  //无限分类  递归大法开始
  function fun ($_info,$deep=0){
      //判断是不是数组
      if (is_array($_info)){
          //foreach 循环
           foreach ($_info as $key=>$val){
               //第一次前面-没有 以后每次循环增加4个  顺便输出键名
              echo   str_repeat(' - ',$deep).$key.'<br />';
              //递归  输出键值  顺便每次前面增加4个----
              fun($val,$deep+4);
           }
      } else {
           //如果键值不是数组 那么 直接返回
          echo str_repeat('-', $deep) . "$val<br />";
          }
  }
?>

递归解释:
递归作为一种算法,在程序设计语言中广泛应用,是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象。
递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写程序能使程序变得简洁和清晰。

若不采用递归,执行效率相对较低。


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪php四舍五入的三种实现方法 iis7站长之家
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,