码迷,mamicode.com
首页 > Web开发 > 详细

PHP-无限级分类

时间:2016-07-20 17:42:26      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

给定省市地区数组如下:

$area = array(
                   array(‘id‘=>1,‘name‘=>‘安徽‘,‘parent‘=>‘0‘),
                   array(‘id‘=>2,‘name‘=>‘海淀‘,‘parent‘=>‘7‘),
                   array(‘id‘=>3,‘name‘=>‘濉溪县‘,‘parent‘=>‘5‘),
                   array(‘id‘=>4,‘name‘=>‘昌平‘,‘parent‘=>‘7‘),
                   array(‘id‘=>5,‘name‘=>‘淮北‘,‘parent‘=>‘1‘),
                   array(‘id‘=>6,‘name‘=>‘朝阳‘,‘parent‘=>‘7‘),
                   array(‘id‘=>7,‘name‘=>‘北京‘,‘parent‘=>‘0‘),
                   array(‘id‘=>8,‘name‘=>‘上地‘,‘parent‘=>‘2‘)   
       );

无限级分类的应用有如下几种:

1、找指定栏目的子栏目

2、找指定栏目的子孙栏目--子孙树

3、找指定栏目的父栏目/父父栏目....------家谱树

#找指定栏目的子栏目#

function sontree($arr,$id=0){//默认从顶级栏目开始找

$son = array();

 foreach($arr as $v){

    if($v[‘parent‘] == $id){

         $son[] = $v;

    }

}
return $sons;
}

echo ‘<pre>‘;

print_r(sontree($area,0));

echo‘</pre>‘;

#找指定栏目的子孙栏目--子孙树#

function substree($arr,$id=0,$jibie=0){

       $tree = array();

    foreach($arr as $v){

       if($v[‘parent‘] == $id){

               $tree[] = $v;

               $v[‘jibie‘] = $jibie;

               $tree = array_merge($tree,subtree($arr,$v[‘id‘]),$jibie+1);

}

   return $tree;

}


}


echo ‘<pre>‘;

print_r(substree($area,0));

echo‘</pre>‘;

//方法二(static)

function substree($arr,$id=0,$jibie=0){

       static $tree = array();

    foreach($arr as $v){

       if($v[‘parent‘] == $id){

               $tree[] = $v;

               $v[‘jibie‘] = $jibie;

             subtree($arr,$v[‘id‘]),$jibie+1);

}

   return $tree;

}


}

echo ‘<pre>‘;

print_r(substree($area,0));

echo‘</pre>‘;

#家谱树#

//方法一

  

 function parenttree($arr,$id=0){

                  $par = array();

                   foreach($arr as $v){

         if($v[‘id‘] == $id)

           {

                 

                                        if($v[‘parent‘] > 0){ //如果为0就是顶级 它没有父栏目....

                array_merge($par,parenttree($arr,$v[‘[parent‘]));

              $par[] = $v;//第一次把自己存入
                                                    /*把$par[] = $v;/写在后面        array_merge($par,parenttree($arr,$v[‘[parent‘]));就是先进后出
                                                        结果可以是:北京-》海淀-》上地
                                                        写在前面结果相反
                                                         递归递归-先递在归
                                                         */

              }

            }

               }

             return $par;

}

echo ‘<pre>‘;

print_r(parenttree($area,0));

echo ‘</pre>‘;                                                 

方法二:

  function parenttree($arr,$sid=0,$jibie=1){
    static $parent = array();
    static $pid = null;
     foreach($arr as $val){
          if($sid == $val[‘id‘]){
            $pid = $val[‘parent‘];
            //$parent[] = $val;
          }
     }
     foreach($arr as $val1){
          if($pid == $val1[‘id‘]){
             $val1[‘jibie‘] = $jibie;
            $parent[] = $val1;
            parenttree($arr,$pid,$jibie+1);
            }
     }
     return $parent;
  }
    echo ‘<pre>‘;
    print_r(parenttree($area,8,1));
    echo ‘</pre>‘;
    exit;
    $parent_arr = parenttree($area,8,1);
    foreach($parent_arr as $val){
         echo @str_repeat(‘&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp‘,$val[‘jibie‘]),$val[‘name‘],‘<br/>‘;
    }
/*
 经过测试这个方法我只求出了它的父亲以上的栏目,它自己没有存入,也请大家帮忙修改
 这个方法造成的缺陷就是在例如面包屑导航条上有bug  
*/

 

PHP-无限级分类

标签:

原文地址:http://www.cnblogs.com/YangJieCheng/p/5688977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!