PHP数组迭代逻辑的问题
本例中所需的逻辑可能简单,也可能不简单,但我无法理解。所以,我请求帮助 查询之后,我得到一个数组,它看起来有点像这样:PHP数组迭代逻辑的问题,php,arrays,logic,Php,Arrays,Logic,本例中所需的逻辑可能简单,也可能不简单,但我无法理解。所以,我请求帮助 查询之后,我得到一个数组,它看起来有点像这样: Array=> [0]=> ['name'] = item1 ['id'] = 1 ['parent_id'] = 0 [1]=> ['name'] = item2 ['id'] = 2 ['parent_id'] = 1
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
Array=>
["item1"]="/item1"
["item2"]="/item1/item2"
["item3"]="/item5/item3"
现在,我需要为列表中的每个项目创建路径。路径类似于:/item1
用于item1,类似于/item1/item2
用于item2
注:项目不一定按顺序排列。父项可能位于其子项之后
所以,基本上,我需要一个循环(可能不止1个),当它遇到一个项目时,它会写下项目名称,前面有一个斜杠。然后,它查看parent\u id
,并用斜杠写下parent\u id
的名称
然后它查看父对象的父对象id
,并用斜杠写下该名称。它将继续执行此操作,直到遇到0的父id。在这一点上,它会给数组赋值,因此类似于路径['item2']=“/item1/item2”
的内容会移动到下一个id并重复
谢谢你的帮助,祝你愉快
编辑:修复了项目3的id,所有项目都有不同的id。
我被要求改进这个问题:
最终的输出数组应该有点像这样:
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
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);
}
}
函数getCollPath($proj_list,$length){
$total_path=“”;
$path=array();
对于($j=0;$j<$length+1;$j++){
如果(isset($proj_list[$j])){
$id=$j;
$name=$proj_列表[$j]['name'];
$total_path=getItemPath($proj_list,$id,NULL);
$path[$name]=$total\u路径;
}
}
返回$path;
}
函数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\u parent\u id==0){
如果(isset($path)){
返回$current_path.$path;
}
否则{
返回$current_path;
}
}
否则{
如果(!isset($path)){
$path=$current\u路径;
}
返回getItemPath($proj_list,$current_parent_id,$path);
}
}
递归函数。它查找id=child.parent\u id的数组元素。然后以当前parent\u id作为参数调用self,直到到达parent\u id=“”或“0”的元素。它应该将面包屑的一段返回给父调用,以便原始调用通过递归函数获得整个路径。它查找id=child.parent\u id的数组元素。然后以当前parent\u id作为参数调用self,直到到达parent\u id=“”或“0”的元素。它应该将面包屑的一部分返回给父调用,这样原始调用就可以获得整个路径为什么item2
和item3
共享相同的id
?最终的输出是什么?@webbiedave-oops这只是一个输入错误。所有id都是唯一的。@Jon数组中的最终输出是什么?这看起来像是路径=>[“item1”]=>“/item1”、[“item2”]=>“/item1/item2”、[“item3”]=>“/item5/item3”`等等。或者,你说的是实际的显示?在这种情况下,我需要制作一个htmlselect
表单,每个项目都作为一个选项,并且我需要以某种方式将它的路径关联起来,可以是隐藏字段,也可以是通过Ajax或其他方式。@zermy好的,请在问题中发布以改进它。为什么item2
和item3
共享相同的id
?最终输出是什么?@webbiedave-oops这只是一个输入错误。所有id都是唯一的。@Jon数组中的最终输出是什么?这看起来像是路径=>[“item1”]=>“/item1”、[“item2”]=>“/item1/item2”、[“item3”]=>“/item5/item3”`等等。或者,你说的是实际的显示?在这种情况下,我需要制作一个htmlselect
表单,每个项目都作为一个选项,并且我需要以某种方式将它的路径关联起来,或者与一个隐藏字段关联起来,或者只是通过Ajax或其他方式关联起来。@zermy好的,请在问题中发布以改进它。