【发布时间】:2011-12-15 22:11:13
【问题描述】:
这种情况下所需的逻辑可能很简单,但我想不通。所以,我正在寻求帮助。
查询后,我得到一个看起来有点像这样的数组:
Array=>
[0]=>
['name'] = item1
['id'] = 1
['parent_id'] = 0
[1]=>
['name'] = item2
['id'] = 2
['parent_id'] = 1
[2]=>
['name'] = item3
['id'] = 3
['parent_id'] = 5
现在,我需要为列表中的每个项目创建路径。路径类似于:/item1 用于 item1,/item1/item2 用于 item 2。
注意:项目不一定按顺序排列。父项可能在其子项之后...
所以,基本上,我需要一个循环(可能不止 1 个),当它遇到一个项目时,它会写下项目名称,并在前面加上一个斜线。然后,它查看parent_id 并写下parent_id 的名称,并在前面加上一个斜线。
然后它查看父级的parent_id 并写下该名称并在前面加上一个斜线。它继续执行此操作,直到遇到 0 的 parent_id。此时,它为数组分配一个值,因此类似于 paths['item2'] = "/item1/item2" 并移动到下一个 id 并重复!
感谢您的帮助,祝您有美好的一天!
edit:修复了 item3 的 id,所有的项目都应该有不同的 id。 我被要求改进这个问题: 最终的输出数组应该有点像这样:
Array=>
["item1"]="/item1"
["item2"]="/item1/item2"
["item3"]="/item5/item3"
最终的输出将是一个 html 选择表单,其中每个项目作为一个选项,我需要以某种方式关联它的路径,无论是与隐藏字段还是仅通过 Ajax 或其他方式。
编辑:我解决了这个问题。我只是想我会在这里写出解决方案,以防其他人偶然发现。 注意:仍然不确定它是如何工作的,但它确实有效!我不知道这可能效率低下。
function getCollPath($proj_list, $length){
$total_path = "";
$paths = array();
for ($j = 0; $j < $length + 1; $j++){
if (isset($proj_list[$j])){
$id = $j;
$name = $proj_list[$j]['name'];
$total_path = getItemPath($proj_list, $id, NULL);
$paths[$name] = $total_path;
}
}
return $paths;
}
function getItemPath($proj_list, $current_id, $path){
$current_parent_id = $proj_list[$current_id]['parent_id'];
$current_name = $proj_list[$current_id]['name'];
$current_path = "/".$current_name;
if ($current_parent_id == 0){
if (isset($path)){
return $current_path.$path;
}
else{
return $current_path;
}
}
else{
if (!isset($path)){
$path = $current_path;
}
return getItemPath($proj_list, $current_parent_id, $path);
}
}
【问题讨论】:
-
为什么
item2和item3共享同一个id? -
最终输出是什么?
-
@webbiedave 哎呀,这只是一个错字。所有的 id 都是唯一的。
-
@Jon 数组中的最终输出?这看起来像
paths=>["item1"]=>"/item1",["item2"]=>"/item1/item2",["item3"]=>"/item5/item3"` 和很快。或者,您是在谈论实际显示吗?在这种情况下,我需要制作一个带有每个项目的 htmlselect表单作为选项,并且我需要以某种方式关联它的路径,无论是与隐藏字段还是通过 Ajax 或其他方式。 -
@zermy 好的,请在问题中发布以改进它。