从MySQL结果创建分层数组

时间:2013-01-06 01:45:24

标签: php mysql arrays loops

我已经看过其他有关此事的问题但不太像我的情况。我在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

因此,我需要根据父字段将数组$格式转换为分层数组。父级为0表示它是顶级项目。因此,由于Single的父母为2,因此Page的子女又是3的父母,并且是Facebook的孩子。

任何人都可以帮助我将我的数组转换为分层数组,然后告诉我如何循环输出它?

2 个答案:

答案 0 :(得分:0)

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

  1. 执行SELECT WHERE .... AND parent = 0;
  2. 对于1中的每个结果,$ id = term_id,选择WHERE ... AND parent = $ id
  3. 递归重复,直到不再有结果
  4. 如果性能有问题,您仍然可以将查询转储到您的阵列并将相同的算法应用于阵列,但如果您确实拥有那么多的音量,那么很可能会出现内存问题。

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

最后,您将获得一个层次结构的关联数组,其中父项为关键字。然后递归遍历它,你将得到结果:

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 . '-');
          }
    }
}

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