我已经看过其他有关此事的问题但不太像我的情况。我在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的孩子。
任何人都可以帮助我将我的数组转换为分层数组,然后告诉我如何循环输出它?
答案 0 :(得分:0)
如果由于查询量导致的性能不会成为问题,最简单的解决方案是,不是进行填充数组的单个查询,而是在分层树中为每个节点执行一次查询,添加“AND” parent = $ id“,其中$ id是当前节点的term_id。类似的东西:
如果性能有问题,您仍然可以将查询转储到您的阵列并将相同的算法应用于阵列,但如果您确实拥有那么多的音量,那么很可能会出现内存问题。
答案 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 . '-');
}
}
}
我没有测试这段代码,但算法是正确的。