php 便利三级数组,javascript - 根据下面数组怎么生成三级联动菜单树?(考虑性能)...

本文介绍如何使用PHP和JavaScript构建一个动态的无限级分类树,通过递归和数组操作,展示了如何将数据转换成树形结构并展示在下拉列表中。数据库操作也作为一个优化方案被提及,通过Oracle查询实现层级查询和展示。
摘要由CSDN通过智能技术生成

一级Id为负数、parentId为空,二级parentId等于一级id,三级parentId等于二级id

[{"name": "广东","Id": -1,"parentId": null},

{"name": "湖北","Id": -2,"parentId": null},

{"name": "广州","Id": 44,"parentId": -1},

{"name": "武汉","Id": 58,"parentId": -2},

{"name": "深圳","Id": 12,"parentId":-1 },

{"name": "白云","Id": 741,"parentId": 44}]

回复内容:

一级Id为负数、parentId为空,二级parentId等于一级id,三级parentId等于二级id

[{"name": "广东","Id": -1,"parentId": null},

{"name": "湖北","Id": -2,"parentId": null},

{"name": "广州","Id": 44,"parentId": -1},

{"name": "武汉","Id": 58,"parentId": -2},

{"name": "深圳","Id": 12,"parentId":-1 },

{"name": "白云","Id": 741,"parentId": 44}]

效果如图

bVzDlz

写的有点难看,不过不受限于数组的排序(不一定要按照级数递减),也不受限于3级。

其实这也就是一个递归的关系,贴下我项目中的代码吧:

/**

* 获取树的树形的下拉列表数组

* @param string $model 模型名称

* @param int $m 点位符数量

* @param string $pid 父级id

* @param array field 字段名的数组

*/

function dropdown_tree($model,$m=0,$pid=0,$field=array('id','sortname','parentid'))

{

$model=$model."_model";

$this->_CI->load->model($model);

$class_arr=$this->_CI->$model->all();

$return_arr=array();

$this->dropdown_array($m,$pid,$class_arr,$return_arr,$field);

return $return_arr;

}

/**

* 遍历数组,修改其样式。

*/

function dropdown_array($m,$pid,$class_arr,&$return_arr,$field){

$n = str_pad('',$m,'-',STR_PAD_RIGHT);

$n = str_replace("-"," ",$n);

foreach($class_arr as $item){

if($item["$field[2]"]==$pid){

$return_arr[$item["$field[0]"]]=$n."|--".$item["$field[1]"];

$this->dropdown_array($m+1,$item["$field[0]"],$class_arr,$return_arr,$field);

}

}

}

直接来个无限级分类的代码吧。

Javascript 版本

var districts = [

{"name": "广东", "Id": 1, "parentId": 0},

{"name": "湖北", "Id": 2, "parentId": 0},

{"name": "广州", "Id": 3, "parentId": 1},

{"name": "武汉", "Id": 4, "parentId": 2},

{"name": "深圳", "Id": 5, "parentId": 0},

{"name": "白云", "Id": 6, "parentId": 3},

{"name": "江夏", "Id": 7, "parentId": 4},

{"name": "景云路", "Id": 8, "parentId": 6}

];

function arrayToTree(parentId) {

var temp = [];

for (var index in districts) {

if (districts[index].parentId == parentId) {

temp.push({

data: districts[index],

children: arrayToTree(districts[index].Id)

});

}

}

return temp;

}

function outputTree(items, depth) {

var str = '';

for (var index in items) {

/* repeat() 特性属于 ECMAScript 2015(ES6)规范 */

str += ' - - '.repeat(depth) + items[index].data.name + '

';

if (items[index].children.length) {

str += outputTree(items[index].children, depth + 1);

}

}

return str;

}

var result = outputTree(arrayToTree(0), 0);

document.write(result);

最终输出效果如下:

广东

- - 广州

- - - - 白云

- - - - - - 景云路

湖北

- - 武汉

- - - - 江夏

深圳

PS:分隔符可以自定义。求路过大牛帮忙优化:arrayToTree() ^_^

PHP 版本

以前写过,请直接戳这里,懒得复制了 _^_。

非常在意性能的话这种因为数量级不大可以考虑不用3级联动,加工一下,然后输入如下的Option就行了。

首页

-首页

--首页

首页

就是根据ID找归类,直接JQ判断记载就好了

不邀自答,(考虑性能)私以为在数据根源入手是最有效直接的,来个数据库版的.

建表语句

create table TP_CITY

(

Id NUMBER ,

name VARCHAR2(255),

parentId NUMBER

);

insert into tp_city values(-1,'广东', null);

insert into tp_city values(-2,'湖北', null);

insert into tp_city values(44,'广州', -1);

insert into tp_city values(58,'武汉', -2);

insert into tp_city values(12,'深圳', -1);

insert into tp_city values(741,'白云', 44);

比如使用oracle的层级查询

select lpad(' ', (level-1)*2, ' ')||name name

from tp_city

start with id<0 connect by parentId=prior Id;

返回结果如下:

bVzKG9

我们也可以这样写:

select sys_connect_by_path(name, '-') path

from tp_city

start with id<0 connect by parentId=prior id;

返回结果是:

bVzKH1

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值