php - 如何使用 php 将树状数组输出到列表中?

标签 php arrays algorithm recursion

我的主要问题是我想使用 PHP 在 HTML 中生成一个无序列表。我从 SQL 查询中获取数据,然后需要使用我自己尝试编写的 PHP 函数将其连接到无序列表中。每个项目都应该是一个li,如果它有一个子项目,它应该打开一个新的ul,子项目为li,它又可以包含子项目等

我有一个数组,我在其中输出树本身的每个部分。它看起来像这样:

[0] => Array (
    [0] => Application Integration
    [1] => 
    )
[1] => Array (
    [0] => Application Integration
    [1] => Windows
    [2] => 
    )
[2] => Array (
    [0] => Application Integration
    [1] => Windows
    [2] => Leitungen
    )
[3] => Array (
    [0] => Application Integration
    [1] => Windows
    [2] => Leitungen
    [3] => WAN
    )
[4] => Array (
    [0] => Application Integration
    [1] => Windows
    [2] => Leitungen
    [3] => Mail
    )
[5] => Array (
    [0] => Application Integration
    [1] => Windows
    [2] => EDI
    )
[6] => Array (
    [0] => Application Integration
    [1] => Windows
    [2] => EDI
    [3] => Word
    )
[7] => Array (
    [0] => Application Integration
    [1] => Windows
    [2] => EDI
    [3] => LAN
    )
[8] => Array (
    [0] => Application Integration
    [1] => Internet
    [2] => 
    )
[9] => Array (
    [0] => Application Integration
    [1] => Internet
    [2] => Office
    )
[10] => Array (
    [0] => Application Integration
    [1] => Internet
    [2] => Office
    [3] => Powerpoint
    )
[11] => Array (
    [0] => Application Integration
    [1] => Internet
    [2] => Office
    [3] => Excel
    )
[12] => Array (
    [0] => Application Integration
    [1] => Internet
    [2] => Leitungen
    )
[13] => Array (
    [0] => Application Integration
    [1] => Internet
    [2] => Leitungen
    [3] => SQL Developer
    )
[14] => Array (
    [0] => Application Integration
    [1] => Internet
    [2] => Leitungen
    [3] => Pokerstars
    )

我希望输出被一个无序列表包围,其中数组中的每个项目都是一个列表元素,如果它有一个子项目,它也应该在一个无序列表中,......它应该像下面的列表:

<ul>
  <li>
    Applicaton Integration
    <ul>
      <li>
        Windows 
        <ul>
          <li>
            EDI
            <ul>
              <li>Word</li>
              <li>LAN</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>
        Internet
        <ul>
          <li></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>
...etc

我尝试用 PHP 编写以下函数,但它并不是我想要的,因为它提前和/或太晚关闭了标签。

function treeOut(array $tree): string{
  $markup = '';
  print_r($tree);
  foreach($tree as $branch) {
    if(!empty($branch[1])){
      $markup.='<ul class="Stufe1">';
      $markup.='<li>';
        if(!empty($branch[2])){
          $markup.='<ul class="Stufe2">';
          $markup.='<li>';
            if(!empty($branch[3])){
              $markup.='<ul class="Stufe3">';
              $markup.='<li>';
              $markup.='<input type="checkbox" name=""/>'.$branch[3];
              $markup.='</li></ul>';
            }else{
              $markup.='<input type="checkbox" name=""/>'.$branch[2];
            }
            $markup.='</ul></li>';
          }else{
          $markup.='<input type="checkbox" name=""/>'.$branch[1];
        }
        $markup.='</li></ul>';
    }else{
      $markup.='<li><input type="checkbox" name=""/>'.$branch[0];
    }
  }
  return $markup;
}

我很抱歉有那么多代码,但我会很感激任何帮助。

最佳答案

要解决涉及嵌套级别的数据结构的问题,但应该以大致相同的方式处理,递归是你最好的 friend 。

如果您不熟悉这种技术,我们的想法是设计一个会调用自身的函数。

关于你的问题,我们可以这样考虑:

首先,一个函数来修改你的数组,以便它可以被处理。

function nester(array $array, $idx = 0) {
    if (array_key_exists($idx, $array) && !empty($array[$idx])) {
        return array($array[$idx] => nester($array, $idx + 1));
    }
    return array();
}

function treeParser(array $array_tree) {
    $dom_tree = '';
    foreach ($array_tree as $key => $val) {
        if (is_array($val) && count($val)) {
            $dom_tree .= "<li>$key".treeParser($val).'</li>';
        } else {
            $dom_tree .= "<li>$key</li>";
        }
    }
    return ($dom_tree ? "<ul>$dom_tree</ul>" : '');
}

$array_nested = array();

foreach ($array as $value) {
    $array_nested[] = nester($value);
}
$DOM_tree = treeParser(array_merge_recursive(... $array_nested));

在此之前,一个函数会浏览您的每个子数组并将它们转换为嵌套数组,以便我们可以对它们进行递归。在 array_merge_recursive 的帮助下,这些数组被合并到您要构建的 DOM 的干净树中。

然后另一个函数将您的数组作为参数并使用 foreach 浏览它。 每次找到一个数组时,它都会附加一对 <li>包含当前数组键的标签,如果它不为空,则最终返回调用该数组的自身。 当函数的一个实例处理完它的整个子数组时,它返回它的工作——字符串 $dom_tree - 在 <ul> 之间标签。 如果那个实例是主要实例——你自称的那个——这些<ul>标签将是包含整个数据结构的主要无序列表。

从理论上讲,无论阵列的深度如何,它都可以工作,但如果它非常深,请注意堆栈溢出。

关于php - 如何使用 php 将树状数组输出到列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45480020/

相关文章:

javascript - 如何将url中的变量php获取到javascript

ios - 如何在Swift 3中将NSFormatter数字用于数组中的波斯或阿拉伯数字?

java - 递归重复字符串

performance - Clojure 中的 Takeuchi 数字(性能)

algorithm - Bellman-Ford 算法的正确性,我们还能做得更好吗?

php - Roundcube 插件砖安装

php - yii 中的访问控制列表或基于角色的访问控制

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

javascript - 具有自定义浮点索引的二维数组式数据结构

javascript - JS - 从数组中获取前 5 个最大元素