PHP迭代与递归完成Infiniti级分类_php技术_脚本之家

本文实例为我们大饱眼福了PHP递归实现层级树状张开的根本代码,供大家参照他事他说加以考查,具体内容如下

在生机勃勃部分复杂的体系中,必要对信息栏目进行极端级的分类,以提升系统的左右逢源。那么PHP是怎么落到实处Infiniti级分类的吧?大家在本文中利用递归算法并结合mysql数据表达成Infiniti级分类。递归,说来讲去就是后生可畏段程序代码的重新调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中另行调用函数,直到抵达有个别条件才跳出,重返相应的数据。Mysql第意气风发我们筹算一张数据表class,记录商品归类新闻。表中有八个字段,id:分类编号,主键自增进;title:分类名称;pid:所属上级分类id。class表结构:

最为级分类是开辟中平淡无奇的情状,由此本文对广阔的Infiniti极分类算法实行计算总结.

函数的法则很简短,重要正是用了须臾间递归调用。 复制代码 代码如下: function file_list{ if
($handle = opendir { while (false !== ($file = readdir { if ($file !=
“.” && $file != “..”) { if (is_dir { echo $path.”: “.$file.”
“;//去掉此行突显的是全部的非目录文件 file_list; } else { echo $path.”:
“.$file.”
“; } } } } }
这些函数还能够继续做一些更上大器晚成层楼,出席一些文件夹或文件的Logo什么的,那样就能够做成更有力的贰个函数了,有意思味的朋友可以扩张的瞬间。

/*** 无级递归分类 TP框架* @param int $assortPid 要查询分类的父级id* @param mixed $tag 上下级分类之间的分隔符* @return string $tree 返回的分类树型结构结果 **/function recursiveAssort($assortPid, $tag = ''){ $assort = M->where("class_pid = $assortPid")->field('class_id, class_name')->select(); foreach  { $tree .= '' . $tag . $value['class_name'] . ''; $tree .= recursiveAssort($value['class_id'], $tag . ' '); } return $tree;}

/** * 利用php的引用传递 CI框架 * */ public function get_access; $field = 'id, pid, method, name, description'; $q_access = $this->db->select->get; $q_result = $q_access->result_array(); if  { $items = array(); foreach  { $items[$value['id']] = $value; } foreach ($items as $key => $item) { if  { $access[] = &$items[$key]; } else { $items[$item['pid']]['sub_access'][] = &$items[$key]; } } } return $access; }
 $arr['id'], 'fid' => $arr['fid'], 'name' => $arr['name'], ); } // 将数据按照缩进简单排列 见图1 function data2arr($tree, $rootId = 0, $level = 0) { foreach { if($leaf['fid'] == $rootId) { echo str_repeat . $leaf['id'] . ' ' . $leaf['name'] . '
'; foreach { if($l['fid'] == $leaf['id']) { data2arr($tree, $leaf['id'], $level + 1); break; } } } } } data2arr; echo '
-----------------------------------------------------------------------
'; // 将数据按照所属关系封装 见图2 function arr2tree { $return = array(); foreach { if($leaf['fid'] == $rootId) { foreach { if($subleaf['fid'] == $leaf['id']) { $leaf['children'] = arr2tree; break; } } $return[] = $leaf; } } return $return; } $tree = arr2tree; print_r; echo '
-----------------------------------------------------------------------
'; // 将数据使用HTML再次展现 见图3 function tree2html { echo '
CREATE TABLE IF NOT EXISTS `class`  NOT NULL AUTO_INCREMENT, `title` varchar NOT NULL, `pid` mediumint NOT NULL DEFAULT '0', PRIMARY KEY  ENGINE=MyISAM DEFAULT CHARSET=utf8; 
$arr = [ 1=>['id'=>1,'name'=>'父1','father'=>NULL], 2=>['id'=>2,'name'=>'父2','father'=>NULL], 3=>['id'=>3,'name'=>'父3','father'=>NULL], 4=>['id'=>4,'name'=>'儿1-1','father'=>1], 5=>['id'=>5,'name'=>'儿1-2','father'=>1], 6=>['id'=>6,'name'=>'儿1-3','father'=>1], 7=>['id'=>7,'name'=>'儿2-1','father'=>2], 8=>['id'=>8,'name'=>'儿2-1','father'=>2], 9=>['id'=>9,'name'=>'儿3-1','father'=>3], 10=>['id'=>10,'name'=>'儿3-1-1','father'=>9], 11=>['id'=>11,'name'=>'儿1-1-1','father'=>4], 12=>['id'=>12,'name'=>'儿2-1-1','father'=>7],];function generateTree{ $tree = array(); foreach{ if(isset($items[$item['father']])){ $items[$item['father']]['son'][] = &$items[$item['id']]; }else{ $tree[] = &$items[$item['id']]; } } return $tree;}$tree = generateTree;print_r;

如上正是本文的全体内容,希望本文的原委对大家的学习也许专门的工作能带给一定的相助,同有的时候候也愿意多多指教脚本之家!

  • ‘ .$leaf[‘name’]; if(! emptyempty tree2html; echo ‘

PHP听他们讲分化的急需,大家提供两种不一致格式的自定义函数,后生可畏种是回来字符串,黄金年代种是回来数组,二种函数都施用了递归方法。先看重回字符串格式的函数:

以此算法利用了循环迭代,将线性结构根据父子关系以树形结构输出,算法的关键在于使用了援用.

‘; } tree2html;

function get_str { global $str; $sql = "select id,title from class where pid= $id"; $result = mysql_query;//查询pid的子类的分类 if($result && mysql_affected_rows{//如果有子类 $str .= '

优点:速度快,效率高.

如上正是本文的全体内容,希望对我们学习php程序设计具备助于。

  • ” . $row[‘id’] . “–” . $row[‘title’] . “

劣点:数组的key值必得与id值相通,不便于抽取数据

‘; } return $str; }

$arr = [ 0=>['id'=>1,'name'=>'父1','father'=>0], 1=>['id'=>2,'name'=>'父2','father'=>0], 2=>['id'=>3,'name'=>'父3','father'=>0], 3=>['id'=>4,'name'=>'儿1-1','father'=>1], 4=>['id'=>5,'name'=>'儿1-2','father'=>1], 5=>['id'=>6,'name'=>'儿1-3','father'=>1], 6=>['id'=>7,'name'=>'儿2-1','father'=>2], 7=>['id'=>8,'name'=>'儿2-1','father'=>2], 8=>['id'=>9,'name'=>'儿3-1','father'=>3], 9=>['id'=>10,'name'=>'儿3-1-1','father'=>9], 10=>['id'=>11,'name'=>'儿1-1-1','father'=>4], 11=>['id'=>12,'name'=>'儿2-1-1','father'=>7],];function generateTree{ static $tree=[]; foreach { if($val['father'] == $id) { $flg = str_repeat; $val['name'] = $flg.$val['name']; $tree[] = $val; generateTree($arr , $val['id'] ,$step+1); } } return $tree;}$tree = generateTree;foreach { echo $val['name'].'
';}

以上函数get_str()通过递归,不断询问下级分类,并最后回到字符串,大家能够依照项目必要纠正在那之中的str,最后生成二个极度分级列表:

行使了递归,数组的key值与id值能够不相同等,最终以风流洒脱大器晚成的协会输出数组

include_once; //连接数据库,connect.php文件自己写一个啊 echo get_str; //输出无限级分类 

亮点:方便遍历,查找父亲和儿子成分

进而大家来看再次回到数组格式的函数,同样要运用递归:

症结:php不擅长递归,数据量大的动静下功效会显着裁减

function get_array{ $sql = "select id,title from class where pid= $id"; $result = mysql_query;//查询子类 $arr = array(); if($result && mysql_affected_rows{//如果有子类 while($rows=mysql_fetch_assoc{ //循环记录集 $rows['list'] = get_array; //调用函数,传入参数,继续查询下级 $arr[] = $rows; //组合数组 } return $arr; } } 

以上就是本文的全体内容,希望对大家的就学抱有利于,也期望大家多多点拨脚本之家。

函数get_array()再次来到了数组,那是大家愿意的,所以作者推荐应用get_array()获得数组,那样一来,大家得以对数组举办自由操作,例如我们得以将数组转变来json格式的数据传给前端页面,前端页面能够透过解析json数据灵活浮现分类音信。比方树形结构的归类列表,下拉分类列表等。

include_once; //连接数据库 $list = get_array; //调用函数 print_r; //输出数组 

倘若要出口json格式的数据,则可利用:

echo json_encode; 

以上措施教会我们哪些利用php达成递归Infiniti级分类,希望那篇作品对我们的上学抱有助于。

发表评论

电子邮件地址不会被公开。 必填项已用*标注