我有一个返回以下内容的数组:
$products = [
'product' => [
[
"product_parent" => "Parent Name 1",
"product_name" => "Product 1",
],
[
"product_parent" => "Parent Name 1",
"product_name" => "Product 2",
],
[
"product_parent" => "Parent Name 2",
"product_name" => "Product 1",
],
[
"product_parent" => "Parent Name 3",
"product_name" => "Product 1",
]
]
];
我需要返回一个像这样结构化的新数组,它是(关联)数组的(索引)数组
'product' => [
0 => [
'product_name' => 'Parent Name 1'
'product_info' => [
0 => [
"product_name" => "Product 1",
],
1 => [
"product_name" => "Product 2",
]
]
],
1 => [
'product_name' => 'Parent Name 2'
'product_info' => [
0 => [
"product_name" => "Product 1",
],
1 => [
"product_name" => "Product 2",
]
]
]
]
我尝试了各种foreach循环,但我无法找到一种方法来正确设置索引,就像我上面所需的输出一样。
我尝试过的事情:
我最初也在研究这种方法,因为它可以减少查询次数并提高性能,因此效率更高。希望这可以帮助将来的某个人。
$variables = [];
foreach($query_results as $key => $group) {
$sub_groups = $this->db->select('*')
->from('products')
->where('parent_id', $group['id'])
->get();
$variables[0]['product'][$key]['product_group'] = $group['product_name'];
$variables[0]['product'][$key]['product_info'] = array_values($sub_groups->result_array());
}
这将返回上面我想要的数组结构类型,但具有更好的性能。
答案 0 :(得分:1)
您可以使用array_reduce
来实现此目标。
$products = array(
'product' => array(
array(
"product_parent" => "Parent Name 1",
"product_name" => "Product 1",
),
array(
"product_parent" => "Parent Name 1",
"product_name" => "Product 2",
),
array(
"product_parent" => "Parent Name 2",
"product_name" => "Product 1",
),
array(
"product_parent" => "Parent Name 3",
"product_name" => "Product 1",
)
)
);
//
$result = array_reduce($products['product'], function($c, $v){
if ( !isset( $c[ $v['product_parent'] ] ) ) $c[ $v['product_parent'] ] = array( 'product_name' => $v[ "product_parent" ], 'product_info' => array() );
$c[ $v['product_parent'] ]["product_info"][] = array( "product_name" => $v[ "product_name" ] );
return $c;
}, array());
//Constructing the final array
$result = array( 'product' => array_values( $result ) );
echo "<pre>";
print_r( $result );
echo "</pre>";
这将导致:
Array
(
[product] => Array
(
[0] => Array
(
[product_name] => Parent Name 1
[product_info] => Array
(
[0] => Array
(
[product_name] => Product 1
)
[1] => Array
(
[product_name] => Product 2
)
)
)
[1] => Array
(
[product_name] => Parent Name 2
[product_info] => Array
(
[0] => Array
(
[product_name] => Product 1
)
)
)
[2] => Array
(
[product_name] => Parent Name 3
[product_info] => Array
(
[0] => Array
(
[product_name] => Product 1
)
)
)
)
)