3

我已经看到了其他关于此的问题,但与我的情况不太一样。我在 MySQL 中有下表:

   term_id       name           slug                 taxonomy     parent
1             Entry Form     entry-form           format       0
2             Page           page                 format       3
3             Facebook       facebook             format       0
4             Entry Form     facebook-entry-form  format       3
5             Twitter        twitter              format       0
6             Single        single                format       2

我有以下 OBJECT 查询:

$formats = $wpdb->get_results($wpdb->prepare("
    SELECT * FROM table t
    WHERE t.taxonomy = 'format'
"));

我结束了以下数组:

Array ( [0] => stdClass Object ( [term_id] => 1 [name] => Entry Form [slug] => entry-form [taxonomy] => format [parent] => 0 ) [2] => stdClass Object ( [term_id] => 2 [name] => Page [slug] => page [taxonomy] => format [parent] => 3 ) [3] => stdClass Object ( [term_id] => 3 [name] => Facebook [slug] => facebook [taxonomy] => format [parent] => 0 ) [4] => stdClass Object ( [term_id] => 4 [name] => Entry Form [slug] => entry-form-facebook [taxonomy] => format [parent] => 3 ) [5] => stdClass Object ( [term_id] => 5 [name] => Twitter [slug] => twitter [taxonomy] => format [parent] => 0 ) [6] => stdClass Object ( [term_id] => 6 [name] => Single [slug] => single [taxonomy] => format [parent] => 2 ) ) 1

以上所有内容都需要转换为输出的分层列表,如下所示:

Entry Form
Twitter
Facebook
 - Entry Form
 - Page
 -- Single

因此,我需要将数组 $formats 转换为基于父字段的分层数组。0 的父项表示它是顶级项目。因此,由于 Single 的父节点为 2,因此它是 Page 的子节点,而 Page 的父节点又是 3,并且是 Facebook 的子节点。

谁能帮我把我的数组变成一个分层数组,然后告诉我如何循环输出它?

4

2 回答 2

0

如果由于查询量而导致的性能不会成为问题,最简单的解决方案是,不是执行单个查询来填充数组,而是在分层树中的每个节点执行一个查询,添加一个“AND parent = $ id”,其中 $id 是当前节点的 term_id。就像是:

  1. 做一个 SELECT WHERE .... AND parent = 0;
  2. 对于 1 中的每个结果,$id = term_id,选择 WHERE ... AND parent = $id
  3. 递归重复直到没有更多结果

如果性能是一个问题,您仍然可以将查询转储到您的数组并将相同的算法应用于数组,但如果您真的有这么多的容量,您很可能会遇到内存问题。

于 2013-01-06T02:10:44.100 回答
0

您需要在从数据库中获取数据时将数据放入 assoc 数组中:

//$groups - result array

$groups = array();

//$record contains the assoc array of the current record
while($record = $result->fetchAssoc()) {
      if (!isset($groups[$record["parent"]]))
      {
            $groups[$record["parent"]] = array();
      }

      array_push($groups[$record["parent"]], $record);
}

最后,您将获得一个以 parent 作为键的层次结构的 assoc 数组。然后递归遍历它,你会得到结果:

function print_recursively(&$groups, $parent_id, $dashes = '')
{
    if(isset($groups[$parent_id]))
    {
          foreach($groups[$parent_id] as $key => $value)
          {
                print $dashes . ' ' . $value["name"];
                print_recursively(&$groups, $value["term_id"], $dashes . '-');
          }
    }
}

我没有测试这段代码,但算法是正确的。

于 2013-01-06T02:11:09.867 回答