php获取数据的父节点 php获取flag

php中如何获取全部子节点的父节点

假设你系统里数据库请求的函数是 pdo_query (你自己根据情况调整),表名是tblcate

创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的繁昌网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

另外,这段代码使用到了array_column函数,该函数从php5.5起才有,如果你的版本较低,要找一个兼容函数放到函数库里(官方文档评论中就有实现)

以下是代码文本 如果复制过去出现T_VARIABLE错误,就是代码中字符被系统混掉了,你要重新手打一下

//这里根据你的意思,应该是选出没有下级的节点,如果需要全部或其它的,你根据情况修改,不影响后面的其它操作

$selectedNodes = pdo_query("select * from tblcate where pid not in(select pid from tblcate)");

//选出全部节点

$allNodes = pdo_query("select * from tblcate ");

//将节点数据使用id索引,方便获取

$allNodes = array_column($allNodes, NULL, 'id');

foreach($selectedNodes as $node){

$tree = getParentNode($node['pid']);

//这里的$tree 是上级名称拼起来的,不包含本级名称,如要包含,在后面附加上就行了

$node['tree'] = implode(',',$tree);

}

unset($node);

var_export($selectedNodes );

function getParentNode($pid){

global $allNodes;

$pnodes=[];

if($pid 0 isset($allNodes[$pid])){

$pNode = $allNodes[$pid];

$pnodes[]= $pNode['name'];

$rnodes = getParentNode($pNode['pid']);

if(!empty($rnodes)){

$pnodes = array_merge($pnodes,$rnodes);

}

}

return $pnodes;

}

php写函数 根据子类(id)递归查找顶级父类(id) 返回父类名字 (表结构:id name pid)

你这种表结构叫邻接表,查询的方式通过自连接。如

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4

FROM Tbname AS t1

LEFT JOIN Tbname AS t2 ON t2.pid = t1.id

LEFT JOIN Tbname AS t3 ON t3.pid = t2.id

LEFT JOIN Tbname AS t4 ON t4.pid = t3.id

WHERE t1.name = 'XXXX'

这种方法的主要局限是你需要为每层数据添加一个自连接,随着层次的增加,自连接

变得越来越复杂,检索的性能自然而然的也就下降了。当然这种结构在查询前必须知道该节点所处的层级,否则无法确定自连接的深度。

邻接表模型的局限性很大,用纯SQL实现有一定的难度。不妨考虑其他模型,比如嵌套模型。

嵌套模型的基本结构是树型结构,SQL检索比邻接表要方便很多。

关于嵌套模型,PHPChina的第一期电子杂志PHPer也有过深入探讨,请参考!

[PHP][THNIKPHP]如何递归查询数据库

function get_category($id){

$str=array();

//$sql = "select * from biao where id=$id";查询节点,自己写吧

$result = array('id'=,'parent_id'=);//查询结果一个数组格式

if($result){

$str = get_category($result['parent_id']);

$str[]=$result;

}

return $str;

}

}

调用get_category()就行了,$str第一个元素是节点本身,去掉就行了。

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

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

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

CREATE TABLE  `product_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 `product_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 product_categories as c, product_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 product_categories as c, product_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 product_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 product_categories AS c, product_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 product_categories AS c, product_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_dump($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 product_categories AS c, product_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_dump($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 product_categories WHERE name = '$left_node'");$stmt-execute();

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

$right_node=$rs['right_node'];

$pdo-exec("UPDATE product_categories SET right_node = right_node + 2 WHERE right_node $right_node");$pdo-exec("UPDATE product_categories SET left_node = left_node + 2 WHERE left_node $right_node");$pdo-exec("INSERT INTO product_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 product_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 product_categories WHERE left_node BETWEEN $left_node AND $right_node");$pdo-exec("UPDATE product_categories SET right_node = right_node - $width WHERE right_node $right_node");$pdo-exec("UPDATE product_categories SET left_node = left_node - $width WHERE left_node $right_node");}

deleteNode('数码产品');

完成之后表结构如下:

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

php+mysql怎么获取网站的所有栏目树状结构?

给你个原理吧

先找第一层

然后在里面递归获取下一层的

如果你知道递归怎么写的应该就明白了


本文名称:php获取数据的父节点 php获取flag
路径分享:http://bzwzjz.com/article/dosspee.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 手机网站建设套餐 重庆网站设计 app网站建设 成都网站建设 专业网站设计 成都网站建设公司 四川成都网站设计 重庆企业网站建设 成都模版网站建设 成都企业网站建设公司 成都网站建设 上市集团网站建设 网站设计 手机网站制作 梓潼网站设计 成都网站制作 定制网站设计 手机网站制作 成都网站制作 企业网站建设 网站制作公司 成都网站建设