【问题标题】:Creating a single SELECT using multilevel parent->child array使用多级父->子数组创建单个 SELECT
【发布时间】:2023-04-06 16:55:01
【问题描述】:

我使用了以下 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
                                        )
                                ) 
                        ) 
                )
        )
)

现在我想使用该排序数组并生成一个 single HTML SELECT,它显示并表示父->子结构,如下例所示:

<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 'User Manual -> Users -> Privileges',VALUE 是 Privileges 的 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。欢迎在这里提供任何帮助。谢谢!

【问题讨论】:

  • 你的阵列是什么样的?可能涉及到递归的味道。
  • 你说得对,我使用递归来显示 2 个级别,所以我遇到的问题是保留超过两个级别的树结构历史。问题是递归通过预先排序的数组进行。它与每个孩子打交道,随着它的进步,它是孩子,自然而然。因此,当它退回到以前的孩子时,我很难概念化退回字符串。希望这是有道理的。我将使用数组示例更新我的帖子。
  • @Brad:您的 sn-p 中没有递归调用。 toUL 是什么? $target 是什么?你会考虑使用视觉提示(缩进)而不是重复完整的路径来表达层次结构吗?
  • @nikc:很抱歉。我编辑了帖子以修复该 toUL。我为这篇文章将函数重命名为 buildOptions 并忘记更新递归回调。我会对视觉提示感兴趣,并假设视觉提示(缩进)将基于树的深度。我考虑了这一点,但我的思想无法围绕这个想法展开,因为它似乎与我最初想要完成的目标非常相似。
  • @Brad:几乎完全一样,但传输的字节更少,最终用户读取的内容也更少;-) [你只需要传递一个int递归堆栈,将$parent = null 替换为$level = 0 并调用buildOptions(&lt;...&gt;, $level + 1),然后使用$level 作为边距/填充乘数。]

标签: php html arrays select


【解决方案1】:

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

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

【讨论】:

  • 谢谢!我不敢相信我离得那么近。伙计……我可以发誓我试过了。我认为盯着同一个问题的时间太多了。
  • 我还不能发布我自己的答案作为跟进,但我稍微修改了你的回复以检查 if (!$parent) then only print $v['name']." -> ",否则打印 $parent.$v['name']." -> ".
  • 请注意:如果我盯着一个问题看太多小时,我会站起来走开……也许是想在外面呼吸些新鲜空气。 1-2 小时后,我通常会在 10 分钟内解决问题。这对我有用。 :)
  • @edem:确实! guido:您的更新版本完美无缺。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多