这种情况下所需的逻辑可能很简单,但我无法理解。所以,我正在寻求帮助。
在查询之后,我得到一个看起来有点像这样的数组:
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
现在,我需要为此列表中的每个项目创建路径。对于第1项,路径类似于:/item1
,对于第2项,路径类似于/item1/item2
。
注意:项目不一定是有序的。父项可能会在它的孩子之后......
所以,基本上,我需要一个循环(可能超过1),当它遇到一个项目时,它会记下以斜杠开头的项目名称。然后,它查看parent_id
并写下以{斜杠开头的parent_id
名称。
然后它查看父级parent_id
并写下该名称前面的斜杠。它会继续执行此操作,直到它遇到parent_id
为0.此时,它会为数组赋值,所以像paths['item2'] = "/item1/item2"
这样的东西会移动到下一个id并重复!
感谢您的帮助,祝您有个美好的一天!
编辑:修正了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);
}
}
答案 0 :(得分:1)
递归函数。它寻找具有id = child.parent_id的数组元素。然后它以当前parent_id作为参数调用self,直到达到parent_id =“”或“0”的元素。它应该将 breadcrumb 的一部分返回到父调用,因此原始调用将获得整个路径