
正文
无限极分类thinkphp5,无限极分类算法优化
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
thinkphp前台怎么输出无限极分类
最主要的是要掌握无限极分类的逻辑,那么写起来就很容易的多了
首先看数据库表:xp_cate
控制器: CateAction.class.php
?php
class CateAction extends Action{
function index(){
$cate=M('Cate');
$list=$cate-field("id,name,pid,path,concat(path,'-',id) as bpath")-order('bpath')-select();
foreach($list as $key=$value){
$list[$key]['count']=count(explode('-',$value['bpath']));
}
$this-assign('alist',$list);
$this-display();
}//添加栏目
function add(){
$cate=new CateModel();if($vo=$cate-create()){
if($cate-add()){
$this-success('添加栏目成功');
}else{
$this-error('添加栏目失败');
}
}else{
$this-error($cate-getError());
}
}}
?
模型:CateModel.class.php
?php
class CateModel extends Model{//对应数据库中的表xp_cate
protected $_auto=array(
array('path','tclm',3,'callback'),
);function tclm(){
$pid=isset($_POST['pid'])?(int)$_POST['pid']:0;
echo ($pid);
if($pid==0){
$data=0;
}else{
$list=$this-where("id=$pid")-find();
$data=$list['path'].'-'.$list['id'];//子类的path为父类的path加上父类的id
}
return $data;
}
}
?
模板:index.html
form action="!-URL-!/add" method="post"
请选择父级栏目:select name="pid" size="20"
option value="0"根栏目/option
volist name="alist" id="vo"
option value="{$vo['id']}"
for start="0" end="$vo['count']"
/for
{$vo['name']}
/option
/volist
/selectbr /
新的栏目名称:input type="text" name="name" /br /
input type="submit" value="添加栏目" /
/form
相关问答
Q1: thinkphp 无限极分类怎么调用出父栏目名称
一、分类表sort的字段:id,pid,title
二、产品表product的字段:id,sortid(对应分类表的id),title
分类表的内容有3个分类,如:
一级分类、二级分类、三级分类
产品表有一条信息,所属分类是二级分类
//列表循环
$product = D('ProductView');//视图模型
if(!empty($sortid)){
//父类找子类
$sortidArr = "";
foreach(findChild($sortResult,$sortid) as $k = $w){
$sortidArr .= $w['sortid'].",";
}
$where['product.sortid'] = array('in',"$sortidArr");
$where['sort.sortid'] = $sortid;
$where['_logic'] = 'or';
$map['_complex'] = $where;
}
Q2: php递归问题(无限极分类)
首先运行的是catsort($arr,0,1);这样循环到北京市,满足循环里的if条件,于是运行catsort($arr,1,2);在这里循环到海定区的时候满足if,于是运行catsort($arr,3,3);在catsort($arr,3,3)里面,循环中没有一条是满足if条件的,也就是没有parent_id=3的元素,所以就没再执行catsort方法了。return之后继续catsort($arr,1,2);的循环,循环到朝阳区。
Q3: thinkphp无限极分类能分页显示吗
TreeTable是一个能把无限分类展现为表格形式的PHP类库插件,分类的层级表示为表格的列,分类的行数表格分类的总数。单元格显示分类名称。
TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构。
1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据。
Tree算法请打开链接:
array(
* 1 = array('id'='1','parentid'=0,'name'='一级栏目一'),
* 2 = array('id'='2','parentid'=0,'name'='一级栏目二'),
* 3 = array('id'='3','parentid'=1,'name'='二级栏目一'),
* 4 = array('id'='4','parentid'=1,'name'='二级栏目二'),
* 5 = array('id'='5','parentid'=2,'name'='二级栏目三'),
* 6 = array('id'='6','parentid'=3,'name'='三级栏目一'),
* 7 = array('id'='7','parentid'=3,'name'='三级栏目二')
* )
2. 导入TreeTable类库。
import('@.ORG.Util.TableTree'); //Thinkphp导入方法
3. 生成TreeTable HTML代码
$treeTable-init($treearr);
echo $treeTable-get_treetable();
注意:get_treetable()只生产表体部门,TALBE/TABLE请自行构建。
完整代码
?php
/**
* File name: TreeTable.class.php
* Author: run.gao 312854458@qq.com Date: 2012-07-24 23:22 GMT+8
* Description: 通用的表格无限级分类
* */
/**
* 表格展示无限分类是将无线分类已表格的形式表现出来,更好的能体现出分类的所属关系
* 使用方法:
* 1. 实例化分类
* $treeTable = new TreeTable();
* 2. 初始化分类,$treearr必须是一个多维数组且包含 id,parentid,name字段
* $treeTable-init($treearr);
* 3. 获取无限分类HTML代码
* echo $treeTable-get_treetable();
* */
class TreeTable {
/**
* 生成树型结构所需要的2维数组
* @var array
*/
public $arr = array();
/**
* 表格列数
* @var int
*/
public $columns = 0;
/**
* 表格行数
* @var int
*/
public $rows = 0;
/**
* 初始化TreeTable数据
* @param array 2维数组
* array(
* 1 = array('id'='1','parentid'=0,'name'='一级栏目一'),
* 2 = array('id'='2','parentid'=0,'name'='一级栏目二'),
* 3 = array('id'='3','parentid'=1,'name'='二级栏目一'),
* 4 = array('id'='4','parentid'=1,'name'='二级栏目二'),
* 5 = array('id'='5','parentid'=2,'name'='二级栏目三'),
* 6 = array('id'='6','parentid'=3,'name'='三级栏目一'),
* 7 = array('id'='7','parentid'=3,'name'='三级栏目二')
* )
*/
public function init($arr=array()){
if(!is_array($arr)) return false;
foreach ($arr as $k=$v) {
$this-arr[$v['id']] = $v;
}
foreach ($this-arr as $k = $v){
$this-arr[$k]['column'] = $this-get_level($v['id']); // Y轴位置
$this-arr[$k]['arrchildid'] = $this-get_arrchildid($v['id']); // 所有子节点
$this-arr[$k]['arrparentid'] = $this-get_arrparentid($v['id']); // 所有父节点
$this-arr[$k]['child_bottom_num'] = $this-get_child_count($v['id']); // 所有底层元素节点
}
$this-columns = $this-get_columns(); // 总行数
$this-rows = $this-get_rows(); // 总列数
// 按照arrparentid和id号进行排序
$this-sort_arr();
foreach ($this-arr as $k = $v){
$this-arr[$k]['row'] = $this-get_row_location($v['id']); // X轴位置
$this-arr[$k]['rowspan'] = $v['child_bottom_num']; // 行合并数
$this-arr[$k]['colspan'] = $v['child_bottom_num'] == 0 ? $this-columns - $v['column'] + 1 : 0; //列合并数
}
return $this-get_tree_arr();
}
/**
* 获取数组
* */
public function get_tree_arr(){
return is_array($this-arr) ? $this-arr : false;
}
/**
* 按arrparentid/id号依次重新排序数组
* */
public function sort_arr(){
// 要进行排序的字段
foreach ($this-arr as $k = $v){
$order_pid_arr[$k] = $v['arrparentid'];
$order_iscost[] = $v['sort'];
$order_id_arr[$k] = $v['id'];
}
// 先根据arrparentid排序,再根据排序,id号排序
array_multisort(
$order_pid_arr, SORT_ASC, SORT_STRING,
$order_iscost, SORT_DESC, SORT_NUMERIC,
$order_id_arr, SORT_ASC, SORT_NUMERIC,
$this-arr);
// 获取每一个节点层次
for ($column = 1; $column = $this-columns; $column++) {
$row_level = 0;
foreach ($this-arr as $key = $node){
if ($node['column'] == $column){
$row_level++;
$this-arr[$key]['column_level'] = $row_level;
}
}
}
// 重新计算以ID作为键名
foreach ($this-arr as $k=$v) {
$arr[$v['id']] = $v;
}
$this-arr = $arr;
}
/**
* 得到父级数组
* @param int
* @return array
*/
public function get_parent($myid){
$newarr = array();
if(!isset($this-arr[$myid])) return false;
$pid = $this-arr[$myid]['parentid'];
$pid = $this-arr[$pid]['parentid'];
if(is_array($this-arr)){
foreach($this-arr as $id = $a){
if($a['parentid'] == $pid) $newarr[$id] = $a;
}
}
return $newarr;
}
/**
* 得到子级数组
* @param int
* @return array
*/
public function get_child($myid){
$a = $newarr = array();
if(is_array($this-arr)){
foreach($this-arr as $id = $a){
if($a['parentid'] == $myid) $newarr[$id] = $a;
}
}
return $newarr ? $newarr : false;
}
/**
* 获取当前节点所在的层级
* @param $myid 当前节点ID号
* */
public function get_level($myid, $init = true){
static $level = 1;
if($init) $level = 1;
if ($this-arr[$myid]['parentid']) {
$level++;
$this-get_level($this-arr[$myid]['parentid'], false);
}
return $level;
}
/**
* 获取当前节点所有底层节点(没有子节点的节点)的数量
* @param $myid 节点ID号
* @param $init 第一次加载将情况static变量
* */
public function get_child_count($myid, $init = true){
static $count = 0;
if($init) $count = 0;
if(!$this-get_child($myid) $init) return 0;
if($childarr = $this-get_child($myid)){
foreach ($childarr as $v){
$this-get_child_count($v['id'], false);
}
}else{
$count++;
}
return $count;
}
/**
* 获取节点所有子节点ID号
* @param $catid 节点ID号
* @param $init 第一次加载将情况static初始化
* */
public function get_arrchildid($myid, $init = true) {
static $childid;
if($init) $childid = '';
if(!is_array($this-arr)) return false;
foreach($this-arr as $id = $a){
if($a['parentid'] == $myid) {
$childid = $childid ? $childid.','.$a['id'] : $a['id'];
$this-get_arrchildid($a['id'], false);
}
}
return $childid ;
}
/**
* 获取该节点所有父节点ID号
* @param $id 节点ID号
* */
public function get_arrparentid($id, $arrparentid = '') {
if(!is_array($this-arr)) return false;
$parentid = $this-arr[$id]['parentid'];
if($parentid 0) $arrparentid = $arrparentid ? $parentid.','.$arrparentid : $parentid;
if($parentid) $arrparentid = $this-get_arrparentid($parentid, $arrparentid);
return $arrparentid;
}
/**
* 获取节点所在地行定位
* @param $myid 节点ID号
*/
public function get_row_location($myid){
$nodearr = $this-arr;
// 获取每一个节点所在行的位置
foreach ($nodearr as $key = $node){
if($myid == $node['id']) {
$node_row_count = 0;
$arrparentid = explode(',', $node['arrparentid']);
// 所有父节点小于当前节点层次的底层节点等于0的元素
foreach ($arrparentid as $pid){
foreach ($nodearr as $node_row){
if($node_row['column'] == $nodearr[$pid]['column'] $nodearr[$pid]['column_level'] $node_row['column_level'] $node_row['child_bottom_num'] == 0){
$node_row_count ++;
}
}
}
// 所有当前节点并且节点层次(rowid_level)小于当前节点层次的个数
foreach ($nodearr as $node_row){
if($node['column'] == $node_row['column'] $node_row['column_level'] $node['column_level']){
$node_row_count += $node_row['child_bottom_num'] ? $node_row['child_bottom_num'] : 1;
}
}
$node_row_count++;
break;
}
}
return $node_row_count;
}
/**
* 获取表格的行数
* */
public function get_rows(){
$row = 0;
foreach ($this-arr as $key = $node){
if($node['child_bottom_num'] == 0){
$rows++; // 总行数
}
}
return $rows;
}
/**
* 获取表格的列数
* */
public function get_columns(){
$columns = 0 ;
foreach ($this-arr as $key = $node){
if($node['column'] $columns){
$columns = $node['column']; // 总列数
}
}
return $columns;
}
/**
* 获取分类的表格展现形式(不包含表头)
* */
public function get_treetable(){
$table_string = '';
for($row = 1; $row = $this-rows; $row++){
$table_string .= "\r\ttr";
foreach ($this-arr as $v){
if($v['row'] == $row){
$rowspan = $v['rowspan'] ? "rowspan='{$v['rowspan']}'" : '';
$colspan = $v['colspan'] ? "colspan='{$v['colspan']}'" : '';
$table_string .= "\r\t\ttd {$rowspan} {$colspan}
{$v['name']}
/td";
}
}
$table_string .= "\r\t/tr";
}
return $table_string;
}
}
?
Q4: php无限极分类实现的方法?
初始化的数据
//初始化原始数据(id=编号,name=显示名称,pid=父级目录id,sort=排序顺序)$data[1] = array('id'='1','name'='一级目录A','pid'='0','sort'='1');
$data[2] = array('id'='2','name'='一级目录B','pid'='0','sort'='2');
$data[3] = array('id'='3','name'='一级目录C','pid'='0','sort'='3');
$data[4] = array('id'='4','name'='一级目录D','pid'='0','sort'='4');
$data[5] = array('id'='5','name'='二级目录A-1','pid'='1','sort'='1');
$data[6] = array('id'='6','name'='二级目录A-2','pid'='1','sort'='2');
$data[7] = array('id'='7','name'='二级目录A-3','pid'='1','sort'='3');
$data[8] = array('id'='8','name'='二级目录B-1','pid'='2','sort'='1');
$data[9] = array('id'='9','name'='二级目录B-2','pid'='2','sort'='2');
$data[10] = array('id'='10','name'='二级目录B-3','pid'='2','sort'='3');
$data[11] = array('id'='11','name'='二级目录C-1','pid'='3','sort'='2');
$data[12] = array('id'='12','name'='二级目录D-1','pid'='4','sort'='1');
$data[13] = array('id'='13','name'='二级目录D-2','pid'='4','sort'='2');
$data[14] = array('id'='14','name'='三级目录A-2-1','pid'='6','sort'='1');
$data[15] = array('id'='15','name'='三级目录A-2-2','pid'='6','sort'='2');
$data[16] = array('id'='16','name'='三级目录C-1-1','pid'='11','sort'='1');
$data[17] = array('id'='17','name'='三级目录B-2-1','pid'='9','sort'='2');
显示树结构
function printTree($data,$level=0){ foreach($data as $key=$value){ for($i=0;$i=$level;$i++){ echo 'emsp;emsp;';
} echo $value['name']; echo 'br'; if(!empty($value['children'])){
printTree($value['children'],$level+1);
}
}
}
使用递归的方式获取无限极分类数组
function getNodeTree($list,$tree,$pid=0){ foreach($list as $key=$value){ if($pid == $value['pid']){
$tree[$value['id']]=$value; unset($list[$key]);
getNodeTree($list,$tree[$value['id']]['children'],$value['id']);
}
}
}
使用引用-无限极分类
function createNodeTree($list,$tree){ foreach($list as $key=$node){ if(isset($list[$node['pid']])){
$list[$node['pid']]['children'][] = $list[$key];
}else{
$tree[] = $list[$node['id']];
}
}
}
调用
//递归-无限极分类调用getNodeTree($data,$tree);
printTree($tree);//使用引用-无限极分类调用createNodeTree($data,$tree);
printTree($tree);
Q5: php 几种常用的递归 无限极分类
/**
* 递归实现无限极分类
* @param $array 分类数据
* @param $pid 父ID
* @param $level 分类级别
* @return $list 分好类的数组 直接遍历即可 $level可以用来遍历缩进
*/
function getTree($array, $pid =0, $level = 0){
//声明静态数组,避免递归调用时,多次声明导致数组覆盖
static $list = []; foreach ($array as $key = $value){ //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
if ($value['pid'] == $pid){ //父节点为根节点的节点,级别为0,也就是第一级
$value['level'] = $level; //把数组放到list中
$list[] = $value; //把这个节点从数组中移除,减少后续递归消耗
unset($array[$key]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
getTree($array, $value['id'], $level+1);
}
}
关于无限极分类thinkphp5和无限极分类算法优化的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






