时间:2014年3月30日9:54:45无限极分类查找子孙树、家谱树


无限极分类,

0.找指定栏目的子栏目

1.需找指定栏目的指定子孙栏目,即子孙树,

2.需要指定栏目的父栏目/父父栏目,家谱树

<?php

/****

无限极分类

表示地区之间的上下级关系,人为增加一个字段,父栏目的parent_id

如:找A的子栏目时,谁的parent_id的值等于Aid,谁就是A的子栏目

*/

$arr = array(

array('id'=>1,"name"=>'山东','parent'=>0),

array('id'=>2,"name"=>'海淀','parent'=>7),

array('id'=>3,"name"=>'临沂','parent'=>1),

array('id'=>4,"name"=>'昌平','parent'=>7),

array('id'=>5,"name"=>'兰山','parent'=>3),

array('id'=>6,"name"=>'朝阳','parent'=>7),

array('id'=>7,"name"=>'北京','parent'=>0),

array('id'=>8,"name"=>'上地','parent'=>2)

);

//找子栏目

//$id 栏目的子栏目有谁呢?

//数组循环一遍,谁的parent值等于$id ,谁就是子栏目

function findson($arr,$id = 0){// 默认从顶级开始

//循环数组,寻找parent值等于$id

$sons = array();

foreach($arr as $k){

if ($k["parent"] == $id) {

$sons[] = $k;

}

}

return $sons;

}

//找子孙树

function subtree($arr,$id = 0 ,$lev = 1){

//循环数组,寻找parent值等于$id

   //静态局部变量

//static $sub = array();

$sub = array();//不使用静态局部变量,使用array_merge()函数,相加

foreach($arr as $k){

if ($k["parent"] == $id) {

$k["lev"] = $lev;

$sub[] = $k;//找到自己

//数组的加

            //subtree($arr,$k["id"],$lev+1)使用静态局部变量

           $sub = array_merge($sub,subtree($arr,$k["id"],$lev+1));//不使用静态局部变量

}

}

return $sub;

}

$tree = subtree($arr,0,1);

//print_r($tree);

foreach($tree as $k){

echo str_repeat("  ", $k["lev"]).$k["name"]."<br/>";

}

?>

静态局部变量static

函数就是一个封装的执行体,前后执行没有联系,这是正常的

在函数中,声明static静态变量,无论此函数调用多少次,只初始化一次,

以后就会直接沿用该变量,这在递归时很有用,

Static总结:

1 修饰类的属性与方法为静态属性,静态方法

2 static:;method() 延迟绑定

3 在函数或方法中,声明静态变量用

数组的加 和array_merge()合并一个或多个数组

<?php

/****

数组的加 和array_merge()

将一个或多个数组合并

****/

//相同键值合并

$a = array("a","b");

$b = array("c","d");

print_r($a+$b);

//Array ( [0] => a [1] => b )

print_r(array_merge($a,$b));

//Array ( [0] => a [1] => b [2] => c [3] => d )

?>

如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。

然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

无限极分类的应用,

商品的分类

面包屑导航

家谱树:

无限极分类求家谱树

<?php

/****

无限极分类,递归查找家谱树

****/

$arr = array(

array('id'=>1,"name"=>'山东','parent'=>0),

array('id'=>2,"name"=>'海淀','parent'=>7),

array('id'=>3,"name"=>'临沂','parent'=>1),

array('id'=>4,"name"=>'昌平','parent'=>7),

array('id'=>5,"name"=>'兰山','parent'=>3),

array('id'=>6,"name"=>'朝阳','parent'=>7),

array('id'=>7,"name"=>'北京','parent'=>0),

array('id'=>8,"name"=>'上地','parent'=>2)

);

function familyTree($arr,$id){

   //static $tree = array();

$tree = array();

foreach($arr as $k){

if ($k["id"] == $id) {

//$tree[] = $k;//从小栏目到大栏目

if ($k["parent"] > 0) {

            //familyTree($arr,$k["parent"])

$tree = array_merge($tree,familyTree($arr,$k["parent"]));

}

$tree[] = $k;//调整,可改变排列顺序  从大栏目到校栏目

}

}

return $tree;

}

print_r(familyTree($arr,8));

?>

迭代寻找家谱树 ,效率比迭代高,代码少,推荐查找家谱树,使用迭代

<?php

/****

迭代  找家谱树

****/

$arr = array(

array('id'=>1,"name"=>'山东','parent'=>0),

array('id'=>2,"name"=>'海淀','parent'=>7),

array('id'=>3,"name"=>'临沂','parent'=>1),

array('id'=>4,"name"=>'昌平','parent'=>7),

array('id'=>5,"name"=>'兰山','parent'=>3),

array('id'=>6,"name"=>'朝阳','parent'=>7),

array('id'=>7,"name"=>'北京','parent'=>0),

array('id'=>8,"name"=>'上地','parent'=>2)

);

function tree($arr,$id){

$tree = array();

while ($id !== 0) {

foreach($arr as $k){

if ($k["id"] == $id) {

$tree[] = $k;

$id = $k["parent"];

break;

}

}

}

return $tree;

}

print_r(tree($arr,8));

?>

如何用迭代法,找栏目的子孙树

需要使用栈。。

任务栈:parent=0的单元 id

<?php

/****

迭代法找子孙树,

****/

$arr = array(

array('id'=>1,"name"=>'山东','parent'=>0),

array('id'=>2,"name"=>'海淀','parent'=>7),

array('id'=>3,"name"=>'临沂','parent'=>1),

array('id'=>4,"name"=>'昌平','parent'=>7),

array('id'=>5,"name"=>'兰山','parent'=>3),

array('id'=>6,"name"=>'朝阳','parent'=>7),

array('id'=>7,"name"=>'北京','parent'=>0),

array('id'=>8,"name"=>'上地','parent'=>2)

);

function subtree($arr,$parent = 0){ //给定指定的数组,栏目编号

$task = array($parent);//任务栈,先把parent入栈

$tree = array();//地区表,存储找到的地区

while(!empty($task)){ //只要任务表不为空,

$flag = false;

foreach($arr as $k=>$v){

if ($v["parent"] == $parent) {

$tree[] = $v;

array_push($task,$v["id"]);//把找到的地区id入任务栈  

$parent = $v["id"];

unset($arr[$k]);//把找到的单元unset

$flag = true;/;/说明找到了子栏目

}

}

if ($flag == false) {

array_pop($task);

$parent = end($task);

}

}

return $tree;

}

print_r(subtree($arr,0));

?>


你可能感兴趣的:(商城开发)