通过$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中更改输出?
最合适的回答,由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中完成这些工作。