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

时间:2011-07-25 04:02:08

标签: php html arrays select

我在创建排序的多级父级>子数组时使用了以下stackoverflow thread,这非常有用。

以下是基于上述线程的排序方法的示例多级(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
                                        )
                                ) 
                        ) 
                )
        )
)

现在我想采用那个排序数组并生成一个单个 HTML SELECT,它显示并代表parent->子结构,如下例所示:

<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>

上面的目标是编译一个显示字符串,表示每个项目的多级父/子路径。每个选项的VALUE是表示的已编译字符串中的最后一项。因此,对于OPTION'用户手册 - &gt;用户 - &gt;权限'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>

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

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

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;
}

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

1 个答案:

答案 0 :(得分: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;
}