首页 > 后端开发 > 正文

php无限级分类框架 thinkphp无限极分类能分页显示吗

2023-09-16 14:13:46 | 我爱编程网

最近经常有小伙伴私信询问php无限级分类框架 thinkphp无限极分类能分页显示吗相关的问题,今天,我爱编程网小编整理了以下内容,希望可以对大家有所帮助。

php无限级分类框架 thinkphp无限极分类能分页显示吗

thinkphp无限极分类能分页显示吗

TreeTable是一个能把无限分类展现为表格形式的PHP类库插件,分类的层级表示为表格的列,分类的行数表格分类的总数。单元格显示分类名称。

TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构。

1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据。

Tree算法请打开链接: _99943_1452

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\t<tr>";
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\t<td {$rowspan} {$colspan}>
{$v['name']}
</td>";
}
}
$table_string .= "\r\t</tr>";
}
return $table_string;
}
}
?>

php无限级分类框架 thinkphp无限极分类能分页显示吗

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);

php无限级分类框架 thinkphp无限极分类能分页显示吗

php无限极分类的数组怎么组织



PHP无限极分类的数组组织方法
1、新建一张数据表,表字段关系如图
2、从数据库取出数据
3、将数据组织为二维数据的形式
4、遍历数组判断其是否有pid元素
5、使用引用的方式,创建一个多维数组
6、数组组织后的形式
推荐教程:PHP视频教程

以上就是我爱编程网小编整理的内容,想要了解更多相关资讯内容敬请关注我爱编程网。
与“php无限级分类框架 thinkphp无限极分类能分页显示吗”相关推荐
ci框架php分页功能 PHP分页显示制作详解
ci框架php分页功能 PHP分页显示制作详解

求PHPCI框架大神解决一个分页问题review这段:if($this-&gt;data['count']&gt;0){$this-&gt;load-&gt;library('pagination');$config['total_rows'] = $this-&gt;data['count'];$config['base_url'] = site_url().'news/';$off

2023-09-19 02:15:05
php分页框架 PHP分页显示制作详解
php分页框架 PHP分页显示制作详解

PHP+MySQL高效的分页方法,如何优化LIMIT,OFFSET进行的分页?很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽然没有拿来就能用的解决办法,但了解数据库的底层或多或少有助于优化分页查询。我们先从一个常用但性能很差的查询来看一看。SELECT*FROMc

2023-08-31 05:41:38
php框架分页 PHP分页显示制作详解
php框架分页 PHP分页显示制作详解

用PHP如何实现分页并能够实现上一页,下一页,跳转到()页的功能?&lt;html&gt;&lt;head&gt;&lt;title&gt;分页示例(php&lt;/title&gt;&lt;metahttp-equiv="Content-Type"content="text/html;charset=gb2312"&gt;&lt;/head&gt;&lt;body&gt;

2023-08-31 21:54:08
pHP框架最多显示多少行 php 如何分行分页显示
pHP框架最多显示多少行 php 如何分行分页显示

php的开发框架是什么php的开发框架是什么?下面为您详细介绍。框架是通过提供一个开发Web程序的基本架构,PHP开发框架就是一种搭建好了的PHP的基本架构。它能够促进快速软件开发(RAD),为我们节约时间,有助于创建更稳定的程序,并减少开发者的重复编写代码的劳动,让我们可以花更多的时间去创造真正的Web程序。拓展:四种主流框架ThinkPHPThinkPHP(FCS)是

2023-09-29 21:32:12
php框架开发搜索分页显示 PHP搜索结果分页显示的问题
php框架开发搜索分页显示 PHP搜索结果分页显示的问题

php分页功能怎么实现在网站中,如果list页内容太多,一般会设置分页功能,今天我们一起来研究一下分页原理,通过一个小案例实现这个功能.分页原理分页显示,将从mysql数据库取出的数据有规律的一段段展示,利用sql语句中的limit将它的起始数据跟页数绑定,根据页数去数据库取数据(推荐学习:PHP视频教程)实现流程1.获取当前url字符串,并用parse_url解析得到u

2023-10-05 15:14:00
php框架的分页查询语句 PHP 查询结果分页显示
php框架的分页查询语句 PHP 查询结果分页显示

php分页代码怎么写Web开发是今后分布式程式开发的主流,通常的web开发都要涉及到与数据库打交道,客户端从服务器端读取通常都是以分页的形式来显示,一页一页的阅读起来既方便又美观。所以说写分页程序是web开发的一个重要组成部分,在这里,我们共同来研究分页程序的编写。一、分页程序的原理分页程序有两个非常重要的参数:每页显示几条记录($pagesize)和当前是第几页($page)。

2023-09-28 08:46:52
tp框架php前台分页显示 按照thinkphp数据分页写完后前端该怎么写
tp框架php前台分页显示 按照thinkphp数据分页写完后前端该怎么写

thinkphp分页怎样才能不显示第几页,只显示上一页下一页?TP官方下载完整版,自带有分页类;也可以自己写分页类$p=newThink\Page($count,$pagesize);//调用分页类$p-&gt;setConfig('theme','%UP_PAGE%%DOWN_PAGE%');//设置显示的样式thinkPHP3.2.3模板怎么增加分页设置找到分页类文件路径:

2023-09-27 04:04:10
php框架数组条件查询多条件 ThinkPHP如何实现多条件分类显示查询啊
php框架数组条件查询多条件 ThinkPHP如何实现多条件分类显示查询啊

ThinkPHP如何实现多条件分类显示查询啊首先要把每个条件存到数组中如:$tj['token']=$token;$tj['xj']='1';$tj['name']=array('like','%'.$keywords.'%');然后进行查询,这样就达到多条件模糊搜索的目的:$search=M('product')-&gt;where($tj)-&gt;sele

2023-10-02 21:40:08