开发者社区> 问答> 正文

如何利用PHP和数组生成类似面包屑样式的字符串文本:报错

有一张表,结构如下:

============
id | pid | name
1 | 0 | 中国
2 | 1 | 浙江
3 | 2 | 杭州
4 | 1 | 广东 
============

现在用PHP从数据库中将该表全部读出成数组如下:

Array
(
    [0] => Array
        (
            [id] => 1
            [pid] => 0
            [name] => 中国
        )
    [1] => Array
        (
            [id] => 2
            [pid] => 1
            [name] => 浙江
        )
    [2] => Array
        (
            [id] => 3
            [pid] => 2
            [name] => 杭州
        )
    [3] => Array
        (
            [id] => 4
            [pid] => 1
            [name] => 广东
        )
)

现在希望写一个函数 getFullname($id) ,传入id,返回类似面包屑效果的文本。
例如:$id = 3,返回文本“中国 – 浙江 – 杭州”;$id = 4,返回文本“中国 – 广东”。

同时为了避免对数据库造成查询压力,因此不希望多次读取数据库,而是希望一次性将表中的数据都读出为数组,然后通过数组的计算组合成文本后再一次性写入数据库。

各位高手看看如何才能实现?

展开
收起
kun坤 2020-06-07 00:35:41 708 0
1 条回答
写回答
取消 提交回答
  • function get_cls($cid){
        
          $arr =  array(
             1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
             2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
             3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
             4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
            5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
            6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
            7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
         );
         
         $data = array();
         while($arr[$cid]){
              $data[] = $arr[$cid]['name'];
              $cid = $arr[$cid]['parentid'];
         }
         $data = array_reverse($data);
         return  implode(' -- ', $data);
      }
      
      
      echo get_cls(7);


    ######回复 @Tuesday : 哦,我明白了,那就是再多做一个数组成员的遍历,把id变成是数组的索引,是吗?######回复 @btgoa : 既然能够索引可以是0, 为什么不能换成id值? id肯定是唯一的呀,######回复 @Tuesday : 我的意思是,从数据库拉出来的数组成员的索引号是连续的从0~N,但是出来的数据库表中的id有可能是不连续的,而且有可能是不连续的。 例如: array(0=>array('id'=>500), 1=>array('id'=>608)); 这样的,这样怎么处理呢?######回复 @btgoa : 这有什么关系? pid的值存在就表示有这么一条数组. 不然上哪找它的上级?######这个代码前提是$arr中每个成员的索引号和里面具体的每一行数据的id号必须一致,parentid对应的其实并不是id,而是$arr[x]中的x,而实际从数据库中取出的数据id号并不一定是连续的,这个该怎么解决呢?谢谢!######

    http://git.oschina.net/binny_w/pmf/blob/master/classes/TreeList.class.php
    你自己再改一下应该就可以用了,不用考虑参数的顺序

    $arrData = array (
        array (
            'id' => 2,
            'name' => 'A',
            'parent_id' => 14
        ),
        array (
            'id' => 19,
            'name' => 'B',
            'parent_id' => 18
        ),
        array (
            'id' => 20,
            'name' => 'C',
            'parent_id' => 18
        ),
        array (
            'id' => 6,
            'name' => 'D',
            'parent_id' => 0
        ),
        array (
            'id' => 9,
            'name' => 'E',
            'parent_id' => 0
        ),
        array (
            'id' => 10,
            'name' => 'F',
            'parent_id' => 0
        ),
        array (
            'id' => 12,
            'name' => 'G',
            'parent_id' => 10
        ),
        array (
            'id' => 13,
            'name' => 'H',
            'parent_id' => 6
        ),
        array (
            'id' => 14,
            'name' => 'I',
            'parent_id' => 9
        ),
        array (
            'id' => 18,
            'name' => 'J',
            'parent_id' => 13
        ),
        array (
            'id' => 16,
            'name' => 'K',
            'parent_id' => 2
        )
    );
    $objTL = new TreeList($arrData);
    print_r($objTL->arrIdBackPath);

    能得到这样的树
    D
      ┊┈ H
      ┊  ┊┈ J
      ┊  ┊  ┊┈ B
      ┊  ┊  ┊┈ C
    E
      ┊┈ I
      ┊  ┊┈ A
      ┊  ┊  ┊┈ K
    F
      ┊┈ G

    ######面包屑和树还是有一些区别,这里想实现的其实不是树结构,而是一个路径######

    定义顶级省份的PID=0  然后数组的key=id    通过id定位pid  递归查询直到pid=0  

    整理输出 就可以了

    这地区的数组 可以缓存成文件,不用使用数据库,记着使用完数组后 unset 下 , 

    2020-06-07 00:35:47
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载