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”`等等。或者,你说的是实际的显示?在这种情况下,我需要制作一个html
select
表单,每个项目都作为一个选项,并且我需要以某种方式将它的路径关联起来,可以是隐藏字段,也可以是通过Ajax或其他方式。@zermy好的,请在问题中发布以改进它。为什么
item2
item3
共享相同的
id
?最终输出是什么?@webbiedave-oops这只是一个输入错误。所有id都是唯一的。@Jon数组中的最终输出是什么?这看起来像是路径=>[“item1”]=>“/item1”、[“item2”]=>“/item1/item2”、[“item3”]=>“/item5/item3”`等等。或者,你说的是实际的显示?在这种情况下,我需要制作一个html
select
表单,每个项目都作为一个选项,并且我需要以某种方式将它的路径关联起来,或者与一个隐藏字段关联起来,或者只是通过Ajax或其他方式关联起来。@zermy好的,请在问题中发布以改进它。