Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换WordPress';wp_list_页面具有多维数组功能,可缩短响应时间_Wordpress_Multidimensional Array_Query Optimization_Response Time - Fatal编程技术网

替换WordPress';wp_list_页面具有多维数组功能,可缩短响应时间

替换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

我正在尝试破解一个比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       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的解决方案对我来说(几乎)足够了。谢谢