php - 如何根据PHP中的特定键值将二维数组转换为三维数组?
问题描述
我有一个数组。
$majorEarning = array(
array(
'user_id' => 1,
'booking_id' => 2,
'price' => 30
),
array(
'user_id' => 2,
'booking_id' => 1,
'price' => 60
),
array(
'user_id' => 2,
'booking_id' => 6,
'price' => 10
),
array(
'user_id' => 1,
'booking_id' => 4,
'price' => 50
)
);
我需要像这样重新排序和重组它:-
Array
(
[0] => Array
(
[user_id] => 1
[booking_data] => Array
(
[0] => Array
(
[booking] => 2
[price] => 30
)
[1] => Array
(
[booking] => 4
[price] => 50
)
)
)
[1] => Array
(
[user_id] => 2
[booking_data] => Array
(
[0] => Array
(
[booking] => 1
[price] => 60
)
[1] => Array
(
[booking] => 6
[price] => 10
)
)
)
)
这是我的编码:-
$formattedEarning = array();
foreach($majorEarning as $keyEarn => $row)
{
if(!empty($formattedEarning))
{
$return = myfunction($formattedEarning, 'user_id', $row['user_id']);
if($return)
{
$earning = array();
$earning['booking'] = $row['booking_id'];
$earning['price'] = $row['price'];
$formattedEarning[$return]['booking_data'][] = $earning;
}
else
{
$earning = array();
$earningChild = array();
$earning['user_id'] = $row['user_id'];
$earningChild['booking'] = $row['booking_id'];
$earningChild['price'] = $row['price'];
$earning['booking_data'][] = $earningChild;
$formattedEarning[] = $earning;
}
}
else
{
$earning = array();
$earningChild = array();
$earning['user_id'] = $row['user_id'];
$earningChild['booking'] = $row['booking_id'];
$earningChild['price'] = $row['price'];
$earning['booking_data'][] = $earningChild;
$formattedEarning[] = $earning;
}
}
print_r($formattedEarning);
function myfunction($products, $field, $value)
{
foreach($products as $key => $product)
{
if ( $product[$field] === $value )
return $key;
}
return false;
}
但是数组是这样的:-
Array
(
[0] => Array
(
[user_id] => 1
[booking_data] => Array
(
[0] => Array
(
[booking] => 2
[price] => 30
)
)
)
[1] => Array
(
[user_id] => 2
[booking_data] => Array
(
[0] => Array
(
[booking] => 1
[price] => 60
)
[1] => Array
(
[booking] => 6
[price] => 10
)
)
)
[2] => Array
(
[user_id] => 1
[booking_data] => Array
(
[0] => Array
(
[booking] => 4
[price] => 50
)
)
)
)
不知道为什么,user_id = 1
添加了一个新元素。正如user_id = 1
已经存在的那样user_id = 1
,预订详细信息应该附加到booking_data
先前记录的 中,而不是另一个带有 的新元素。
我究竟做错了什么?
这是在线沙盒链接:- http://sandbox.onlinephpfunctions.com/code/0feb80c20e2b7df30fdf05662cd7aea415b29464
解决方案
你可以foreach
使用array_key_exists
$r = [];
foreach($majorEarning as $v){
array_key_exists($v['user_id'], $r)
?
($r[$v['user_id']]['booking_data'][] =
['booking'=>$v['booking_id'],'price'=>$v['price']])
:
($r[$v['user_id']] = ['user_id' => $v['user_id'], 'booking_data' => [['booking'=>$v['booking_id'], 'price'=>$v['price']]]]);
}
要重新排列键使用array_values($r)
推荐阅读
- java - 提取名称,用双引号括起来从字符串到列表
- javascript - 特定用户的前端切换功能标志
- c# - 无法创建“AppDbContext”类型的对象
- javascript - Python socket.io ack 函数
- javascript - 如何将多个 then() 承诺合二为一
- java - java - 如何在java中执行多个Future并在for循环之前等待它完成?
- c# - 通过 WCF 服务对 MVC 客户端应用程序进行身份验证和授权?
- javascript - 无法分配给 XX,因为它是只读属性
- mysql - MySQL 多列总和脚本
- c# - 我的表单打开时如何使背景变暗?