请教php生成嵌套列表的方法。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
haiyang416
V2EX    PHP

请教php生成嵌套列表的方法。

  •  
  •   haiyang416 2012-08-31 12:27:53 +08:00 4151 次点击
    这是一个创建于 4839 天前的主题,其中的信息可能已经有所发展或是发生改变。
    10 条回复    1970-01-01 08:00:00 +08:00
    rivsen
        1
    rivsen  
       2012-08-31 12:37:25 +08:00   1
    一行行读,然后数空格。。。
    然后这个操作作成一个迭代循环,最后搞成个关联数组
    然后把数组打印出来
    reus
        2
    reus  
       2012-08-31 12:37:53 +08:00   1
    超越自己能力的算法,自己想出来,可以功力大增,这是一次提升技术水平的机会啊
    rivsen
        3
    rivsen  
       2012-08-31 12:40:48 +08:00
    我以前写过一个读取firefox导出的json格式书签的函数,自己打印出来看,因为当时那个版本firefox的书签管理不太好看,就打印成html格式的了,嘿嘿,最关键的就是那个循环
    rivsen
        4
    rivsen  
       2012-08-31 12:41:58 +08:00   1
    对了,试试yaml样式吧,如果这个txt可以兼容yaml格式,那就可以直接用库来解决啦!
    haiyang416
        5
    haiyang416  
    OP
       2012-08-31 12:42:47 +08:00
    @rivsen 我自己已经用这种方法实现了一次,但是代码看起来真是惨不忍睹。

    @reus 这个问题已经考虑几天了,自己也实现了,就如上面说的,代码没法看。
    reus
        6
    reus  
       2012-08-31 12:46:35 +08:00   1
    先从最简单的情况做起
    a
    写程序让他输出
    <li>a</a>
    然后增加一种输入
    a
    b
    修改程序让它输出
    <li>a</li>
    <li>b</li>
    然后
    a
    b
    输出
    <li>
    <ul><li>b</li></ul>
    </li>
    然后
    a
    b
    c
    输出
    <li>
    <ul>
    <li>b</li>
    <li>c</li>
    </ul>
    </li>

    重复这个步骤,从简单的输入到复杂的输入,不断修改程序,让程序的输出和预想的输出一致,最终就可以得到可以处理复杂的输入的程序了
    haiyang416
        7
    haiyang416  
    OP
       2012-08-31 12:47:31 +08:00
    @reus 接受意见,我自己再想另一种办法来实现,看能不能漂亮一些。
    reus
        8
    reus  
       2012-08-31 12:47:53 +08:00   1
    缩进不见了………… 不过你懂的
    zooandzoo
        9
    zooandzoo  
       2012-08-31 13:22:34 +08:00   1
    这种算法常用语无限分类高效查询,树结构左右分值。。。查询简单,难在如何对节点的增、删、改查、移动、赋值
    本身就是为了解决递归才用这中算法的,如果在其中用到了递归说明你的思路是错误的~!


    <?php
    function getList(){
    $start=1;
    $items = $menu->getItems();

    /*
    * $items=array(
    array(
    'title'=>'类别名称',
    'deeper'=>false,
    'shallower'=>false,
    'level_diff'=>0
    'level'=>2 //缩进等级
    )
    ); */

    $lastitem = 0;

    if ($items) {
    foreach($items as $i => $item)
    {
    //初始化
    $item['deeper'] = false;
    $item['shallower'] = false;
    $item['level_diff'] = 0;

    if (isset($items[$lastitem])) {
    $items[$lastitem]['deeper'] = ($item['level'] > $items[$lastitem]['level']); //该类菜单是否有子菜单
    $items[$lastitem]['shallower'] = ($item['level'] < $items[$lastitem]['level']); //是否是该级别的最后一个
    $items[$lastitem]['level_diff'] = ($items[$lastitem]['level'] - $item['level']); //级别差用来闭合UL和LI的
    }

    $lastitem= $i;

    }

    //用来闭合最顶级ROOT标签
    if (isset($items[$lastitem])) {
    $items[$lastitem]['deeper'] = (($start?$start:1) > $items[$lastitem]['level']);
    $items[$lastitem]['shallower'] = (($start?$start:1) < $items[$lastitem]['level']);
    $items[$lastitem]['level_diff'] = ($items[$lastitem]['level'] - ($start?$start:1));
    }
    }

    return $items;

    }


    ?>

    <ul>
    <?php

    $list=getList();
    foreach ($list as $i => $item) :

    echo '<li>';

    echo '<a href="#">'.$item['title'].'</a>';

    if ($item->deeper) {
    echo '<ul>';
    }

    elseif ($item->shallower) {
    echo '</li>';
    echo str_repeat('</ul></li>', $item->level_diff);
    }
    else {
    echo '</li>';
    }
    endforeach;
    ?>

    </ul>
    haiyang416
        10
    haiyang416  
    OP
       2012-08-31 18:11:26 +08:00
    @zooandzoo 最后决定用正则匹配来解决这个问题。
    http://gist.github.com/3551081
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2839 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:48 PVG 21:48 LAX 05:48 JFK 08:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86