V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
haiyang416
V2EX  ›  PHP

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

  •  
  •   haiyang416 · 2012-08-31 12:27:53 +08:00 · 3680 次点击
    这是一个创建于 4501 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   2584 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 82ms · UTC 00:17 · PVG 08:17 · LAX 16:17 · JFK 19:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.