导航:首页 > 编程语言 > php树

php树

发布时间:2022-01-29 20:21:10

php递归生成树型数组

public function tree(&$list, $parent) {
//保证找到的元素都放在一个数组$tree内,应该是$tree在所有的tree函数都共享
static $tree;
//遍历该数组,找到parent值为当前传递进来的$parent_id;
foreach($list as $row) {
//判断
if($row['parent'] == $parent) {
//保存起来
$tree[] = $row;
//依据当前所找到的分类,找到其子节点,操作相同,递归完成
$this->tree($list, $row['id']);
}
}
return $tree;
}
你把你的数组带进去,这个是在类里面实现的,如果你只是想单独用个方法,你就把public以及'$this->'去掉就行了

㈡ 如何用 PHP + MySQL 实现一个家谱树

mysql 要创建 一张用户表user,记录用户id,名称,年龄,性别,等等信息
再创建一张关系表,relation表,记录 user_id,parent_id
你用php查询的时候,输入一个名称,可以取到他的user_id,根据user_id,可以查出他的父级,还可以查出父级的父级,也可以查出自己的子级,等等关系,这是一个大数组,最后遍历出来就可以了

㈢ 如何用php建立一个树形结构的类 - PHP进阶讨论

[php]tid=$tid;? ? ? ? ? ? ? ? $this->tname=$tname;? ? ? ? ? ? ? ? return true;? ? ? ? }? ? ? ? function add($object){? ? ? ? ? ? ? ? $this->tlib[]=&$object;? ? ? ? ? ? ? ? return true;? ? ? ? }? ? ? ? function display(){? ? ? ? ? ? ? ? $foreach=array();? ? ? ? ? ? ? ? foreach($this->tlib as $objects){? ? ? ? ? ? ? ? ? ? ? ? $foreach[]=array(? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \'id\'=>$objects->tid,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \'name\'=>$objects->tname,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \'object\'=>($objects->display())? ? ? ? ? ? ? ? ? ? ? ? );? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? return $foreach;? ? ? ? }}$tree = new tree(\"01\",\"item01\");$treeSub1 = new tree(\"0101\",\"item0101\");$tree->add($treeSub1);$treeSub2 = new Tree(\"0101\",\"item0101\");$tree->add($treeSub2);print_r($tree->display());?>[/php]

㈣ PHP如何实现权限管理树

<?php
/*
权限设计
有一个全局的管理员root
每个栏目有个管理员权限为其他权限的合
每单个权限为2的倍数
list/read 1
add 2
edit 2
del 4
all admin
*/
if( 5&2)
{
echo 1;
}else{
echo 0;
}
/*
简单的权限管理,有这个基本就够用了,
不做更复杂的了,功能设计上不用考虑权限,
编码的遵循一些规范,在顶层类里,加个适配器
*/
?>

㈤ php树型数组如何转换成列表数组

public function tree(&$list, $parent) {
//保证找到的元素都放在一个数组$tree内,应该是$tree在所有的tree函数都共享
static $tree;
//遍历该数组,找到parent值为当前传递进来的$parent_id;
foreach($list as $row) {
//判断
if($row['parent'] == $parent) {
//保存起来
$tree[] = $row;
//依据当前所找到的分类,找到其子节点,操作相同,递归完成
$this->tree($list, $row['id']);
}
}
return $tree;
}
你把你的数组带进去,这个是在类里面实现的,如果你只是想单独用个方法,你就把public以及'$this->'去掉就行了

㈥ PHP,二叉树,求一个算法

var oNowNode;//现节点
var aArray;//所存数组

var i=0;
if(oNowNode.sibling.id>oNowNode.id){
alert(”位于左区“);

}else{
alert(”位于右区“);

}
while(oNowNode.id!=0){
oNowNode=oNowNode.parent;
aArray(i)=oNowNode.id;
i++;
}
print_r(aArray);

㈦ PHP子孙树函数的传值是用foreach循环的,可是其结果把上次的也显示出来了

不应该用static的,你应该传参。

你是foreach menu里面的,$all被你static了。然后就出现这种情况,第一个菜单获取正常的数组,然后第二个菜单,由于static的存在,导致第二个菜单本身数组包含了第一个菜单里面的。


你可以这样

functionzisun($id,$all=array()){
....
$tree=zisun($v['id'],$all);
....
}

㈧ php怎么输出树形内容

$class=array(
"c1"=>array("第一课","n1"=>"第一节1.1"),
"c2"=>array("第二课","n1"=>"第一节1.2"),
);
echo$class["c1"][0];
echo$class["c2"]["n1"];

这样定义不是要简单很多

㈨ PHP+Dtree实现动态读取三级树

我这有一个现成的
已经被多个网络知道网友采纳了
你可以试下
http://hi..com/zhzsh/blog/item/f0035eda9105aed1b7fd48fb.html

㈩ 请教高手:php实现n叉树遍历

要构建的无限分类的模型. 电子产品是最大的分类.家用电器 ,数码产品是其子分类.可以看到子分类是被父分类包含起来的.每个分类都有左右 两个节点编号分别是1、2、3.....

根据上面的图mysql中建立表和插入数据

CREATE TABLE `proct_categories` (

`id` MEDIUMINT( 8 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,`name` VARCHAR( 20 ) NOT NULL ,

`left_node` MEDIUMINT( 8 ) NOT NULL ,

`right_node` MEDIUMINT( 8 ) NOT NULL

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO `proct_categories` (`id`, `name`, `left_node`, `right_node`) VALUES(1, '电子产品', 1, 20),

(2, '家用电器', 2, 9),

(3, '电视机', 3, 4),

(4, '电冰箱', 5, 6),

(5, '空调', 7, 8),

(6, '数码产品', 10, 19),

(7, '电脑', 11, 18),

(8, '台式电脑', 12, 13),

(9, '笔记本电脑', 14, 15),

(10, '平板电脑', 16, 17);

表结构如下:

下面是PHP的实例代码:

1、获取所有节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT c.name FROM proct_categories as c, proct_categories as pWHERE c.left_node BETWEEN p.left_node AND p.right_nodeAND p.name='电子产品' ORDER BY c.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name'].'<br />';

}

输出:

电子产品

家用电器

电视机

电冰箱

空调

数码产品

电脑

台式电脑

笔记本电脑

平板电脑

2、 获取某个父节点以及其所有子节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT c.name FROM proct_categories as c, proct_categories as pWHERE c.left_node BETWEEN p.left_node AND p.right_nodeAND p.name='数码产品' ORDER BY c.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name'].'<br />';

}

输出:

数码产品

电脑

台式电脑

笔记本电脑

平板电脑

3、获取所有的叶子节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT name FROM proct_categories where right_node-left_node=1");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name'].'<br />';

}

输出:

电视机

电冰箱

空调

台式电脑

笔记本电脑

平板电脑

4、获取某个子节点及其所有父节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT p.name FROM proct_categories AS c, proct_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node AND c.name = '平板电脑' ORDER BY p.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name'].'<br />';

}

输出:

电子产品

数码产品

电脑

平板电脑

5、获取所有节点极其所处的层级

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT c.name, (COUNT(p.name) - 1) AS level FROM proct_categories AS c, proct_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node GROUP BY c.name ORDER BY c.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

var_mp($rs);

echo '<br />';

foreach($rs as $v){

echo $v['name'].' level:'.$v['level'].'<br />';}

输出:

电子产品 level:0

家用电器 level:1

电视机 level:2

电冰箱 level:2

空调 level:2

数码产品 level:2

电脑 level:2

台式电脑 level:3

笔记本电脑 level:3

平板电脑 level:3

6、获取某个节点的层级

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT c.name, (COUNT(p.name) - 1) AS level FROM proct_categories AS c, proct_categories AS p WHERE c.left_node BETWEEN p.left_node AND p.right_node and c.name='平板电脑' GROUP BY c.name ORDER BY c.left_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

var_mp($rs);

echo '<br />';

foreach($rs as $v){

echo $v['name'].' level:'.$v['level'].'<br />';}

输出:

平板电脑 level:3

7、在某个节点后平行的插入一个节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

function addNode($left_node,$new_node){

global $pdo;

$stmt = $pdo->prepare("SELECT right_node FROM proct_categories WHERE name = '$left_node'");$stmt->execute();

$rs=$stmt->fetch(PDO::FETCH_ASSOC);

$right_node=$rs['right_node'];

$pdo->exec("UPDATE proct_categories SET right_node = right_node + 2 WHERE right_node > $right_node");$pdo->exec("UPDATE proct_categories SET left_node = left_node + 2 WHERE left_node > $right_node");$pdo->exec("INSERT INTO proct_categories(name, left_node, right_node) VALUES('$new_node', $right_node + 1, $right_node + 2)");}

addNode('家用电器','办公用品');

完成之后表结构如下:

8、删除某个节点及其所有子节点

<?php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

function deleteNode($node_name){

global $pdo;

$stmt = $pdo->prepare("SELECT left_node,right_node, right_node - left_node + 1 as width FROM proct_categories WHERE name ='$node_name'");$stmt->execute();

$rs=$stmt->fetch(PDO::FETCH_ASSOC);

$left_node=$rs['left_node'];

$right_node=$rs['right_node'];

$width=$rs['width'];

$pdo->exec("DELETE FROM proct_categories WHERE left_node BETWEEN $left_node AND $right_node");$pdo->exec("UPDATE proct_categories SET right_node = right_node - $width WHERE right_node > $right_node");$pdo->exec("UPDATE proct_categories SET left_node = left_node - $width WHERE left_node > $right_node");}

deleteNode('数码产品');

完成之后表结构如下:

可以看到用多叉树的方式构建无限分类,查询的时候是非常简便的.但是在插入新的节点和删除节点时就比较麻烦了.

阅读全文

与php树相关的资料

热点内容
女程序员化妆视频大全 浏览:742
录音笔如何修改文件夹 浏览:645
八爪鱼数据采集加密文字替换 浏览:84
android系统运行动态编译的程序 浏览:419
计算编程中常用的if语句是 浏览:736
linux文件夹权限乱了 浏览:912
程序员职业病预防保健操 浏览:680
c程序修改后需不需要重新编译 浏览:725
怎样把图片分别放置在文件夹中 浏览:873
推流服务器地址是什么 浏览:632
java允许多重继承 浏览:513
解压小玩具好玩又可爱 浏览:410
腾讯云大带宽服务器 浏览:823
加密锁的售后 浏览:270
linux登不上去 浏览:731
联想服务器休眠后如何唤醒 浏览:113
四川话女孩学习编程 浏览:324
编译原理文法区分 浏览:1003
教师可以做程序员嘛 浏览:637
终结战场安卓国际服怎么下载 浏览:155