PHP 自定义数组在相同值和值总和的基础上合并


PHP custom array merge on bases of same value and sum of value

>我有如下数组,

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