修改$wpdb返回的数据结构

时间:2012-11-15 作者:John

通过$wpdb修改SQL输出的多维数组的结构

我需要的输出$wpdb 通过在foreach. 然而,对于性能问题,我正试图避免同样的问题。

我有两个自定义表:

items
- item_id
- item_name

sub_items
- sub_item_id
- item_id
- sub_item_name
我正在运行的查询:

$items_tbl = $wpdb->prefix . \'items\';
$sub_items_tbl = $wpdb->prefix . \'sub_items\';
$results = $wpdb->get_results($wpdb->prepare("SELECT * from $sub_items_tbl LEFT JOIN $items_tbl ON $items_tbl.item_id = $sub_items_tbl.item_id"), ARRAY_A);
这是上述查询的结果输出:

array(
    [0] => array(
        [\'sub_item_id\'] => 1
        [\'item_id\'] => 1
        [\'sub_item_name\'] => \'Lorem Ipsum\'
        [\'item_name\'] => Some Item Name
    )
    [1] => array(
        [\'sub_item_id\'] => 2
        [\'item_id\'] => 1
        [\'sub_item_name\'] => \'Lorem Ipsum Ornare Parturient\'
        [\'item_name\'] => Some Item Name
    )
    [2] => array(
        [\'sub_item_id\'] => 3
        [\'item_id\'] => 2
        [\'sub_item_name\'] => \'Lorem Ipsum Adipiscing Malesuada\'
        [\'item_name\'] => Some Item Name
    )
    [3] => array(
        [\'sub_item_id\'] => 4
        [\'item_id\'] => 2
        [\'sub_item_name\'] => \'Lorem Ipsum Ligula\'
        [\'item_name\'] => Some Item Name
    )
    [4] => array(
        [\'sub_item_id\'] => 5
        [\'item_id\'] => 2
        [\'sub_item_name\'] => \'Lorem Ipsum Sit Adipiscing\'
        [\'item_name\'] => Some Item Name
    )
)
这是我需要的输出:

array(
    [0] => array(
        [\'item_id\'] => 1
        [\'item_name\'] => Some Item Name
        [\'sub_items\'] =>[0] => array(
                            [\'sub_item_id\'] => 1
                            [\'sub_item_name\'] => \'Lorem Ipsum\'
                        )
                        [1] => array(
                            [\'sub_item_id\'] => 2
                            [\'sub_item_name\'] => \'Lorem Ipsum Ornare Parturient\'
                        )
    )
    [1] => array(
        [\'item_id\'] => 2
        [\'item_name\'] => Some Item Name
        [\'sub_items\'] =>[0] => array(
                            [\'sub_item_id\'] => 3
                            [\'sub_item_name\'] => \'Lorem Ipsum Adipiscing Malesuada\'
                        )
                        [1] => array(
                            [\'sub_item_id\'] => 4
                            [\'sub_item_name\'] => \'Lorem Ipsum Ligula\'
                        )
                        [2] => array(
                            [\'sub_item_id\'] => 5
                            [\'sub_item_name\'] => \'Lorem Ipsum Sit Adipiscing\'
                        )
    )
)
我最好修改sql以获得结果输出。但是,如果无法实现,那么如何在PHP中更改输出?

1 个回复
最合适的回答,由SO网友:Manny Fleurmond 整理而成

据我所知,你可以通过两种方式之一来实现这一点:

使用PHP将当前结果与所需结果相结合。基本上:

$记录=数组();

foreach( $results as $result )
{
    $record_id = $result[\'item_id\'];
    if (empty($records[$record_id])) {
        $records[$record_id][\'item_id\'] = $result[\'item_id\'];
        $records[$record_id][\'item_name\'] = $result[\'item_name\'];
        $records[$record_id][\'sub_items\'] = array();
    }
    $records[$record_id][\'sub_items\'][] = array( 
       \'sub_item_id\' => $result[\'sub_item_id\'],
       \'sub_item_name\' => $result[\'sub_item_name\']  
    );
}
另一种方法是进行两次查询。首先找到主要项目。有了主要项目的项目id后,就可以进行二次查询,从中可以获得所有子项目,这些子项目的item\\u id位于之前查询的子项目中。然后,使用PHP将其放在嵌套数组中,类似于第一个选项。

据我所知,你不能在mySQL中真正实现你想要的嵌套结果,所以你必须在PHP中完成这些工作。

结束

相关推荐

$wpdb:计算与3个不同分类中的3个术语对应的帖子

如果我举个例子就更容易了:我有一个自定义的帖子类型MYPOSTTYPE, 有3种分类法TAX_1, TAX_2 和TAX_3如果我有3个术语:“TERM\\u TAX\\u 1”TAX_1, \'TERM\\u TAX\\u 2\'英寸TAX_2, 和中的“TERM\\u TAX\\u 3”TAX_3, 我如何计算有多少MYPOSTTYPE具有SQL查询和$wpdb的所有3个术语?我试过这样的东西,但没用。。。计数器始终为0SELECT COUNT($wpdb->posts.ID) AS count