替换WordPress';wp_list_页面具有多维数组功能,可缩短响应时间
我正在尝试破解一个比WordPress的wp_list_页面更高效(更少的db调用等)的函数,而不需要所有可能的参数和东西。wp_posts表如下所示:替换WordPress';wp_list_页面具有多维数组功能,可缩短响应时间,wordpress,multidimensional-array,query-optimization,response-time,Wordpress,Multidimensional Array,Query Optimization,Response Time,我正在尝试破解一个比WordPress的wp_list_页面更高效(更少的db调用等)的函数,而不需要所有可能的参数和东西。wp_posts表如下所示: ID post_title post_parent 1 Skate brand no1 5 2 Skate brand no2 5 3 Products 0 4 Bikes 3 5 Skate
ID post_title post_parent
1 Skate brand no1 5
2 Skate brand no2 5
3 Products 0
4 Bikes 3
5 Skateboards 3
6 About 0
7 Contact 6
8 Surfboards 3
array
1 => Products
array
1 => Bikes
2 => Skateboards
array
1 => Skate brand no1
2 => Skate brand no2
3 => Surfboards
2 => About
array
1 => Contact
我想要一个如下所示的数组:
ID post_title post_parent
1 Skate brand no1 5
2 Skate brand no2 5
3 Products 0
4 Bikes 3
5 Skateboards 3
6 About 0
7 Contact 6
8 Surfboards 3
array
1 => Products
array
1 => Bikes
2 => Skateboards
array
1 => Skate brand no1
2 => Skate brand no2
3 => Surfboards
2 => About
array
1 => Contact
我应该如何完成这项任务
更新!
通过使用@Gedrox提供的代码替换我网站首页上的大约4或5个wp_列表_页面,每日平均响应时间从不稳定的780-1000毫秒下降到稳定的595-625毫秒。太棒了 如果您需要完整的站点地图,您应该阅读所有记录(我假设是一条
选择记录),并在PHP代码中按层次结构进行组织
示例代码:
// TODO: get this from DB
$list = array(
array('ID' => 1, 'post_title' => 'Skate brand no1', 'post_parent' => 5),
array('ID' => 2, 'post_title' => 'Skate brand no2', 'post_parent' => 5),
array('ID' => 3, 'post_title' => 'Products', 'post_parent' => 0),
array('ID' => 4, 'post_title' => 'Bikes', 'post_parent' => 3),
array('ID' => 5, 'post_title' => 'Skateboards', 'post_parent' => 3),
array('ID' => 6, 'post_title' => 'About', 'post_parent' => 0),
array('ID' => 7, 'post_title' => 'Contact', 'post_parent' => 6),
array('ID' => 8, 'post_title' => 'Surfboards', 'post_parent' => 3),
);
$rootPages = array();
$pagesById = array();
foreach ($list as $key => &$row) {
if ($row['post_parent'] == 0) {
$rootPages[] = &$row;
}
}
foreach ($list as $key => &$row) {
$pagesById[$row['ID']] = &$row;
}
foreach ($list as $key => &$row) {
if ($row['post_parent'] != 0) {
$pagesById[$row['post_parent']]['children'][] = &$row;
}
}
print_r($rootPages);
据我所知,在你的例子中,你正在考虑你想要多少孩子就有多少
这种方法必须通过使用递归来实现。事实上,在wordpress的结构中,如果不进行与节点数量一样多的查询来检查节点是否有子节点,就无法获得整个树
这是一种树状结构,允许每个节点都有n
子节点。目前,MySQL不支持递归子查询,因此此表逻辑不允许您在不需要log(m)
查询的情况下检索完整的“路径”(平均情况下,m
是您考虑的树的节点数量)
这并不像看上去那么简单。有一些方法可以在一个查询中检索所有树,这样可以将sql查询最小化为一个,但这需要修改数据表
这里有一个更详细的例子,你可以看到一些你可以做的选择
编辑:
我再说一遍:
这不是使用1个mysql查询和不使用递归就可以得到的。请不要误解无限儿童的概念。在@Gedrox的回答中,只有当你的树中有3个级别时,它才会起作用 使用递归根据父id创建层次结构。。确切地说,这就是我想要的。你有任何示例代码吗?我一直在尝试将子数组推给它们的父数组,但我做不好。很好,我的层次结构中有四个级别,但对代码稍加修改后,我就可以工作了。谢谢好的,很有趣。我最终使用了4级的层次结构,所以@Gedrox的解决方案对我来说(几乎)足够了。谢谢