算法探讨! up者有分!

LingToSs 2004-05-12 05:45:06
关于无限分类!

以下是一个数组:
Array
(
[1] => Array
(
[0] => Array
(
[1] => <option value='1'>|-分类一</option>

[2] => <option value='2'>|-分类二</option>

[3] => <option value='3'>|-分类三</option>

)

)

[2] => Array
(
[1] => Array
(
[4] => <option value='4'>|--分类一子分类</option>

[5] => <option value='5'>|--分类一子分类二</option>

)

[2] => Array
(
[8] => <option value='8' selected>|--分类二子分类一</option>

[9] => <option value='9'>|--分类二子分类二</option>

)

[3] => Array
(
[10] => <option value='10'>|--三类二子分类一</option>

)

)

[3] => Array
(
[4] => Array
(
[6] => <option value='6'>|---分类一子分类的子分类</option>

)

[8] => Array
(
[11] => <option value='11'>|---二子分类二</option>

)

)

[4] => Array
(
[6] => Array
(
[7] => <option value='7'>|----分类一子分类的子分类的子分类</option>

)

)

)

数组第一级的key 为 分类的级别(几级分类)(可向下无限延伸)
数组第二级的key 为 父级分类的id (id 为0表示项级分类)
数组第三级的key 为 分类本身的id 值。

要求 将这个数组处理后按父子分类排列出来。

即: 要求得到的结果如下:
<option value='1' >|-分类一</option>
<option value='4' >|--分类一子分类</option>
<option value='6' >|---分类一子分类的子分类</option>
<option value='7' >|----分类一子分类的子分类的子分类</option>
<option value='5' >|--分类一子分类二</option>
<option value='2' >|-分类二</option>
<option value='8' >|--分类二子分类一</option>
<option value='11' >|---二子分类二</option>
<option value='9' >|--分类二子分类二</option>
<option value='3' >|-分类三</option>
<option value='10' >|--三类二子分类一</option>


注意: 数组是无限向下延伸的, 结果不能仅限在上面的四级分类中。

求最简单高效的算法。

up 者有分!^^ 不够再+^_^。
...全文
30 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
LingToSs 2004-05-13
  • 打赏
  • 举报
回复
to: xuzuning(唠叨)

这个数组是用一个sql 将 无限分类表类的所有数据入这个数组的,这个数组只是取值,无需维护^_^。

原本是被这问题困扰了一会儿,后面己自己解决了, 和唠叨老大的惊人相似。

现将代码帖出来。
是放置在类中使用的,下面是解决上面问题的部分
--------------------------
// 分析数组
function ReSort($Arr,$a,$b) { //$Arr 为上述的数组
if(is_array($Arr[$a][$b])) {
foreach($Arr[$a][$b] as $k=>$v) {
//echo "<hr>".$k.$v;
$this->sort .= $v;
$this->ReSort($Arr,$a+1,$k);
}
}
Return $this->sort;
}
---------------
明日结帖。
xuzuning 2004-05-13
  • 打赏
  • 举报
回复
注释一下
/***
传入参数
$in 数据数组,
$deep 当前层次,
$key=0 上级键
*/
function foo($in,$deep,$key=0) {
if(!isset($in[$deep])) return; //如果没有所需层次则返回
// 遍历当前层次数据
foreach($in[$deep] as $pid=>$ar)
if($key == $pid) { //检查是否有父节点
foreach($ar as $id=>$v) {
echo "$v\n";
foo($in,$deep+1,$id); //递归,检查当前节点是否有子节点
}
}
}
lavaguo 2004-05-13
  • 打赏
  • 举报
回复
我喜欢用id和parent_id来实现,这样避免了级数问题。
lavaguo 2004-05-13
  • 打赏
  • 举报
回复
我喜欢用id和parent_id来实现,这样避免了级数问题。
zzhhll003 2004-05-13
  • 打赏
  • 举报
回复
up
a9 2004-05-13
  • 打赏
  • 举报
回复
看的头昏了
mark一下
xuzuning 2004-05-13
  • 打赏
  • 举报
回复
真不知道你这个数据打算怎么维护

<?php
$d = array(
1 => array(
0 => array(
1 => "<option value='1'>|-分类一</option>",
2 => "<option value='2'>|-分类二</option>",
3 => "<option value='3'>|-分类三</option>"
)
),
2 => array(
1 => array(
4 => "<option value='4'>|--分类一子分类</option>",
5 => "<option value='5'>|--分类一子分类二</option>"
),
2 => array(
8 => "<option value='8' selected>|--分类二子分类一</option>",
9 => "<option value='9'>|--分类二子分类二</option>"
),
3 => array(
10 => "<option value='10'>|--三类二子分类一</option>",
),
),
3 => array(
4 => array(
6 => "<option value='6'>|---分类一子分类的子分类</option>",
),
8 => array(
11 => "<option value='11'>|---二子分类二</option>",
),
),
4 => Array(
6 => array(
7 => "<option value='7'>|----分类一子分类的子分类的子分类</option>",
),
)
);

function foo($in,$deep,$key=0) {
if(!isset($in[$deep])) return;
foreach($in[$deep] as $pid=>$ar)
if($key == $pid)
foreach($ar as $id=>$v) {
echo "$v\n";
foo($in,$deep+1,$id);
}
}

foo($d,1,0);
?>
多菜鸟 2004-05-13
  • 打赏
  • 举报
回复
http://fason.nease.net/samples/select/
还是这个好,也是无限级的。
causky 2004-05-13
  • 打赏
  • 举报
回复
汗,没看清题目,哈
causky 2004-05-13
  • 打赏
  • 举报
回复
function SplitMyArray($myarray)
{
if (is_array($myarray))
{
foreach ($myarray as $k => $v)
{
SplitMyArray($v);
}
}
else
echo $myarray . "\n";
}
SplitMyArray($array);
没测试呢。。。。。
fun1984 2004-05-13
  • 打赏
  • 举报
回复
up
mynamesucks 2004-05-12
  • 打赏
  • 举报
回复
头晕,只能接分了~~
sahafu89 2004-05-12
  • 打赏
  • 举报
回复
uping
oyzjin 2004-05-12
  • 打赏
  • 举报
回复
我也来取点分吧!
LingToSs 2004-05-12
  • 打赏
  • 举报
回复
是一棵树, 但要求对上面的数组进行处理 得到上面的结果。
52juanjuan 2004-05-12
  • 打赏
  • 举报
回复
up
Cain 2004-05-12
  • 打赏
  • 举报
回复
up
mistjin 2004-05-12
  • 打赏
  • 举报
回复
看你的结果就是CSDN左边的树嘛!
以前看到唠叨,大龄青年都贴过类似的代码,我就不贴了,楼主自己参考一下
http://expert.csdn.net/Expert/topic/2980/2980875.xml?temp=.3668939
redstorm11 2004-05-12
  • 打赏
  • 举报
回复
no2 up
LingToSs 2004-05-12
  • 打赏
  • 举报
回复
up

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧