使用多级parent->子数组创建单个SELECT

Bra*_*rad 5 html php arrays select

我在创建一个有序的多级父 - >子数组时使用了以下stackoverflow 线程,这非常有帮助.

以下是基于上述线程的排序方法的示例多级(3级)父级 - >子排序数组:

Array 
( 
    [1] => Array 
        ( 
            [name] => User Manual 
            [parentId] => 0 
            [children] => Array
                ( 
                    [2] => Array 
                        ( 
                            [name] => Users 
                            [parentId] => 1 
                            [children] => Array 
                                ( 
                                    [4] => Array 
                                        ( 
                                            [name] => Privileges 
                                            [parentId] => 2 
                                        ) 
                                )
                        ) 
                    [3] => Array 
                        ( 
                            [name] => Reference 
                            [parentId] => 1 
                            [children] => Array 
                                ( 
                                    [5] => Array 
                                        ( 
                                            [name] =>  Glossary
                                            [parentId] => 3 
                                        ) 
                                    [6] => Array 
                                        ( 
                                            [name] =>  Index
                                            [parentId] => 3
                                        )
                                ) 
                        ) 
                )
        )
)
Run Code Online (Sandbox Code Playgroud)

现在我想采取这种排序后的数组,并产生一个单一的HTML选择显示和表示父- >子结构,如下面的例子:

<option value='1'>User Manual</option>
<option value='2'>User Manual -> Users</option>
<option value='4'>User Manual -> Users -> Privileges</option>
<option value='3'>User Manual -> Reference</option>
<option value='5'>User Manual -> Reference -> Glossary</option>
<option value='6'>User Manual -> Reference -> Index</option>
Run Code Online (Sandbox Code Playgroud)

上面的目标是编译一个显示字符串,表示每个项目的多级父/子路径.每个选项的VALUE是表示的已编译字符串中的最后一项.因此,对于OPTION'用户手册 - >用户 - >权限',VALUE是权限的ID,但显示文本表示它在数组中的父/子关系.

我创建的选择总是最终显示如下所示的选项列表:

<option value='1'>User Manual</option>
<option value='2'>User Manual -> Users</option>
<option value='4'>Users -> Privileges</option>
<option value='3'>User Manual -> Reference</option>
<option value='5'>Reference -> Glossary</option>
<option value='6'>Reference -> Index</option>
Run Code Online (Sandbox Code Playgroud)

您可以看到它只能跟踪父/子关系的一个级别.

我处理数组以创建选择选项列表的函数如下:

function buildOptions($arr, $target, $parent = NULL) {
  $html = "";
  foreach ( $arr as $key => $v ) 
  {
    if (array_key_exists('children', $v))
    {
      if ( $key == $target )
        $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n";
      else
        $html .= "<option value='$key'>$parent {$v['name']}</option>\n";

      $html .= buildOptions($v['children'],$target,$v['name']." > ");
    }
    else if ( $key == $target )
      $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n";
    else
      $html .= "<option value='$key'>$parent {$v['name']}</option>\n";

  }

  return $html;
}
Run Code Online (Sandbox Code Playgroud)

当有多个级别时,我无法跟踪前一个X parent.name.这里的任何帮助都会受到欢迎.谢谢!

gui*_*ido 3

以这种方式修复您的递归调用,您应该获得每个节点上的完整层次结构:

function buildOptions($arr, $target, $parent = NULL) {
  $html = "";
  foreach ( $arr as $key => $v )
  {
    if ( $key == $target )
      $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n";
    else
      $html .= "<option value='$key'>$parent {$v['name']}</option>\n";

    if (array_key_exists('children', $v)) 
      $html .= buildOptions($v['children'],$target,$parent . $v['name']." > ");
  }

  return $html;
}
Run Code Online (Sandbox Code Playgroud)