Php 如何循环遍历子数组数量不确定的数组

Php 如何循环遍历子数组数量不确定的数组,php,arrays,Php,Arrays,我试图在我的应用程序中列出带有子类别的类别-我可以使用PHP或Javascript/Jquery来实现以下功能: 我有一个类别数组,子类别作为附加数组附加 诀窍在于,它可以深入到有子类别的地方。 子类别也可以有子类别 因此,对于每个类别,它可以有尽可能多的子元素,每个子元素可以有许多子元素数组 通过循环创建下拉列表的最佳方法是什么 以下是转储主阵列时的结构: array (size=2) 0 => array (size=4) 'id' => int 1

我试图在我的应用程序中列出带有子类别的类别-我可以使用PHP或Javascript/Jquery来实现以下功能:

我有一个类别数组,子类别作为附加数组附加

诀窍在于,它可以深入到有子类别的地方。 子类别也可以有子类别

因此,对于每个类别,它可以有尽可能多的子元素,每个子元素可以有许多子元素数组

通过循环创建下拉列表的最佳方法是什么

以下是转储主阵列时的结构:

array (size=2)
  0 => 
    array (size=4)
      'id' => int 1
      'name' => string 'Stationery' (length=10)
      'parent_id' => int 0
      'childs' => 
        array (size=1)
          0 => 
            array (size=4)
              ...
  1 => 
    array (size=3)
      'id' => int 4
      'name' => string 'boots' (length=5)
      'parent_id' => int 0
注意,sub-zero有一个“childs”数组 转储此阵列时,我得到:

array (size=1)
  0 => 
    array (size=4)
      'id' => int 2
      'name' => string 'pens' (length=4)
      'parent_id' => int 1
      'childs' => 
        array (size=1)
          0 => 
            array (size=4)
              ...
请注意,它也附加了一个子对象,当转储时,该子对象看起来像:

array (size=1)
  0 => 
    array (size=4)
      'id' => int 3
      'name' => string 'penfillers' (length=10)
      'parent_id' => int 2
      'childs' => 
        array (size=1)
          0 => 
            array (size=3)
              ...
鬼鬼祟祟-这一个也有另一个孩子

这可以深入到子类别

我如何循环遍历它们并将输出放在下拉列表中? 我不知道如何无限循环直到链条结束

谢谢
Jason

创建一个子函数,子函数的输入将是object,此函数将检查它是数组还是简单元素,如果它是数组,则它将再次调用该元素上的函数,否则返回元素。
只需详细说明“Gerald Schneider”的答案。

您应该递归地生成数组中的所有选项。有两种方法可以实现它。取决于您的PHP版本

为了使核心逻辑更清晰,假设我们使用以下实用程序呈现输出:

//
//一些函数用于整理输出
//
//只需使递归级别可见即可
功能板\u级别($string,$level){
//0级无焊盘
如果($level==0),则返回$string;
//填充一些“-”以显示级别
$pad=str_重复('-',$level);
返回$pad.'.$string;
}
//将叶渲染为选项的标准化信息数组
功能选项\来自($item,$level){
返回数组(
'value'=>$item['id'],
“显示值”=>pad\u级别($item['name'],$level),
);
}
//将选项呈现为HTML选择
函数render_select($name,$options){
$output='';
foreach($options作为$option){
$output.=''。
''.
htmlspecialchars($选项[“显示值”])。
''。“\n”;
}
返回“”。“\n”。
$output。“\n”;
}
//将选项渲染为纯文本显示
函数呈现纯文本($name$options){
$output='';
foreach($options作为$option){
$output.=$option[“value”]。=>。$option[“display_value”]。“\n”;
}
返回$output;
}
以下是两种方法:

//
//核心逻辑
//
//方法1:发电机。适用于PHP 5>=5.5.0
函数选项\u在($array,$level=0)中{
foreach($leaf形式的数组){
从($leaf,$level)获得的收益选项;
//提供子选项(如果有)
if(isset($leaf['childs'])和&is_数组($leaf['childs'])){
foreach(选项在($leaf['childs',$level+1)中作为$option){
收益率美元期权;
}
}
}
}
//方法2:正常递归,然后合并数组。对于PHP4或之后的版本
函数get\u选项($array,$level=0){
$output=array();
//期权数组的收益率
foreach($leaf形式的数组){
$output[]=来自($leaf,$level)的选项;
//让出孩子
if(isset($leaf['childs'])和&is_数组($leaf['childs'])){
$childs=get_选项($leaf['childs',$level+1);
$output=array_merge($output,$childs);//这可能会很慢
}
}
返回$output;
}
这就是如何从中呈现一些HTML:

//伪输入
$input=数组(
排列(
'id'=>1,
“名称”=>“信纸”,
“父项id”=>0,
'childs'=>数组(
排列(
'id'=>2,
'名称'=>'铅笔',
“父项id”=>1,
),
排列(
'id'=>3,
“名称”=>“笔”,
“父项id”=>1,
),
排列(
“id”=>5,
“名称”=>“记事本”,
“父项id”=>1,
'childs'=>数组(
排列(
“id”=>8,
“名称”=>“蓝板”,
“父项id”=>3,
),
排列(
'id'=>9,
'name'=>'Red Pad',
“父项id”=>3,
),
排列(
“id”=>10,
“名称”=>“iPad”,
“父项id”=>3,
),
),
),
),
),
排列(
'id'=>4,
'name'=>'boots',
“父项id”=>0,
),
);
//首选方法1
回显“\n方法1\n”;
echo render_select('mySelect',选项_in($input));
echo呈现纯文本('mySelect',选项($input));
//方法2
回显“\n方法2\n”;
echo render_select('mySelect',get_options($input));
echo呈现纯文本('mySelect',获取选项($input));

下面是一个非常简单的示例,说明了如何使用递归实现。我相信有更好的方法,但这是一个非常简单的函数,所以你可以看到这个概念。函数会调用自身,直到作业完成(我在这里使用方括号数组表示法,因此请确保您的PHP版本支持它)


神奇的词语是:recursioni谢谢:)但具体如何递归呢?我尝试了foreach()但只需要一个层次的深度…)试一试,如果你有问题,回来问一个更具体的问题。这篇文章可以帮助你理解递归你的PHP版本是什么?
<?php

    function getItems(array $items)
    {
            $return = [];

            foreach ($items as $item) {
                    $return[] = $item;

                    if (isset($item['childs']) && count($item['childs']) > 0) {
                            $return = array_merge(
                                    $return,
                                    getItems($item['childs'])
                            );
                    }

            }

            return $return;
    }

    $array = [
            0 => [
                    'id' => 1,
                    'childs' => []
            ],
            1 => [
                    'id' => 2,
                    'childs' => [
                            0 => [
                                    'id' => 3,
                                    'childs' => []
                            ]
                    ]
            ]
    ];

    print_r(getItems($array));