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

2012-08-31 12:27:53 +08:00
 haiyang416
http://gist.github.com/3549054
3675 次点击
所在节点    PHP
10 条回复
rivsen
2012-08-31 12:37:25 +08:00
一行行读,然后数空格。。。
然后这个操作作成一个迭代循环,最后搞成个关联数组
然后把数组打印出来
reus
2012-08-31 12:37:53 +08:00
超越自己能力的算法,自己想出来,可以功力大增,这是一次提升技术水平的机会啊
rivsen
2012-08-31 12:40:48 +08:00
我以前写过一个读取firefox导出的json格式书签的函数,自己打印出来看,因为当时那个版本firefox的书签管理不太好看,就打印成html格式的了,嘿嘿,最关键的就是那个循环
rivsen
2012-08-31 12:41:58 +08:00
对了,试试yaml样式吧,如果这个txt可以兼容yaml格式,那就可以直接用库来解决啦!
haiyang416
2012-08-31 12:42:47 +08:00
@rivsen 我自己已经用这种方法实现了一次,但是代码看起来真是惨不忍睹。

@reus 这个问题已经考虑几天了,自己也实现了,就如上面说的,代码没法看。
reus
2012-08-31 12:46:35 +08:00
先从最简单的情况做起
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
2012-08-31 12:47:31 +08:00
@reus 接受意见,我自己再想另一种办法来实现,看能不能漂亮一些。
reus
2012-08-31 12:47:53 +08:00
缩进不见了………… 不过你懂的
zooandzoo
2012-08-31 13:22:34 +08:00
这种算法常用语无限分类高效查询,树结构左右分值。。。查询简单,难在如何对节点的增、删、改查、移动、赋值
本身就是为了解决递归才用这中算法的,如果在其中用到了递归说明你的思路是错误的~!


<?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
2012-08-31 18:11:26 +08:00
@zooandzoo 最后决定用正则匹配来解决这个问题。
http://gist.github.com/3551081

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/46568

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX