>我有如下数组,
Array(
[0] => Array(
[account] => 251234567890,
[price] => 83
) [1] => Array(
[account] => 251234567890,
[price] => 27
) [2] => Array(
[account] => 251234564526,
[price] => 180
) [3] => Array(
[account] => 251234567890,
[price] => 40
)
)
现在我想合并具有相同account
的数组及其特定price
的总和.
我想要这样的输出数组,
Array(
[251234567890] => Array(
[account] => 251234567890,
[price] => 150
) [251234564526] => Array(
[account] => 251234564526,
[price] => 180
)
)
我试过这样的,
$res = array();
$k = 0;
foreach ($to_account as $vals) {
if (array_key_exists($vals['account'], $res)) {
$res[$k]['price'] += $vals['price'];
$res[$k]['account'] = $vals['account'];
$k++;
} else {
$res[$k] = $vals;
$k++;
}
}
由于在输入数组中仅存在两个唯一的account
,因此输出数组应该是两个帐户,其价格之和
我已经从这里python
看到了这样的东西,但它希望在 python 中有所帮助,我希望它php
我希望有人可以帮助我
谢谢
我将分两步完成此操作,首先按帐户键入,然后转换为所需的输出格式:
$data = [
[
'account' => 251234567890,
'price' => 83
],
[
'account' => 251234567890,
'price' => 27
],
[
'account' => 251234564526,
'price' => 180
],
[
'account' => 251234567890,
'price' => 40
],
];
$keyed = [];
foreach ($data as $item) {
if (!isset($keyed[$item['account']])) {
$keyed[$item['account']] = 0;
}
$keyed[$item['account']] += $item['price'];
}
$merged = [];
foreach ($keyed as $account => $price) {
$merged[] = compact('account', 'price');
}
print_r($merged);
或者,一个功能更强大的解决方案(我喜欢,但有点难以理解):
$keyed = array_reduce($data, function ($carry, $item) {
if (!isset($carry[$item['account']])) {
$carry[$item['account']] = 0;
}
$carry[$item['account']] += $item['price'];
return $carry;
}, []);
$merged = array_map(function ($account, $price) {
return compact('account', 'price');
}, array_keys($keyed), $keyed);
如果你尝试做这样的事情呢:
$arr = array(
0 => array(
'account' => 251234567890,
'price' => 83
), 1 => array(
'account' => 251234567890,
'price' => 27
), 2 =>array(
'account' => 251234564526,
'price' => 180
), 3 => array(
'account' => 251234567890,
'price' => 40
)
);
foreach($arr as $key => $value) {
$newArr[$value['account']][] = $value['price'];
}
foreach($newArr as $key => $value) {
$finalArr[] = array('account'=>$key,'price'=>array_sum($value));
}
$finalArr:
Array ( [0] => Array (
[account] => 251234567890
[price] => 150 )
[1] => Array (
[account] => 251234564526
[price] => 180 ) )
通过分配临时键,您可以确定是否正在处理第一次出现,然后使用适当的技术来存储整个子数组或仅向子数组的price
元素添加值。
代码:(演示)
$to_account = [
[ 'account' => 251234567890, 'price' => 83 ],
[ 'account' => 251234567890, 'price' => 27 ],
[ 'account' => 251234564526, 'price' => 180 ],
[ 'account' => 251234567890, 'price' => 40 ]
];
foreach ($to_account as $row) {
if (!isset($result[$row['account']])) {
$result[$row['account']] = $row;
} else {
$result[$row['account']]['price'] += $row['price'];
// imitate the above line if there was another column to sum
}
}
var_export($result);
输出:
array (
251234567890 =>
array (
'account' => 251234567890,
'price' => 150,
),
251234564526 =>
array (
'account' => 251234564526,
'price' => 180,
),
)
此方法不会覆盖冗余帐户元素值。要重新索引输出数组,只需对其调用array_values()
。
@Jeroen 注意你的答案对我有用,但我已经像这样解决了它,
$final_payment_array = array();
foreach ($to_account as $vals) {
if (array_key_exists($vals['account'], $final_payment_array)) {
$final_payment_array[$vals['account']]['price'] += $vals['price'];
$final_payment_array[$vals['account']]['account'] = $vals['account'];
} else {
$final_payment_array[$vals['account']] = $vals;
}
}
我认为这是性能方面的最佳解决方案
谢谢
的解决方案。你可以试试这个
$myArray = array(
0 => array(
account => 251234567890,
price => 83,
),
1 => array(
account => 251234567890,
price => 27,
),
2 => array(
account => 251234564526,
price => 180,
),
3 => array(
account => 251234567890,
price => 40,
),
);
$keyed = [];
foreach ($myArray as $item) {
if (!isset($keyed[$item['account']])) {
$keyed[$item['account']] = 0;
}
$keyed[$item['account']] += $item['price'];
}
$merged = [];
foreach ($keyed as $account => $price) {
$merged[] = compact('account', 'price');
}
print_r($merged);
https://eval.in/506410