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

时间:2016-01-22 11:13:58

标签: php arrays multidimensional-array array-merge

我的数组如下,

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存在,因此输出数组应该是两个帐户的总和,其价格

我在 here python中看到了类似的内容,但它想要有用,因为它在python中我希望它在{ {1}}我希望有人可以帮助我

谢谢

5 个答案:

答案 0 :(得分:3)

我会分两步完成此操作,首先按帐户键,然后转换为您想要的输出格式:

$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);

答案 1 :(得分:2)

如果你尝试做类似的事情呢?

$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 ) )

答案 2 :(得分:1)

通过分配临时密钥,您可以确定是否正在处理第一个匹配项,然后使用适当的技术来存储整个子数组或仅将值添加到子数组的price元素。 / p>

代码:(Demo

$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'];
    }
}
var_export($result);

输出:

array (
  251234567890 => 
  array (
    'account' => 251234567890,
    'price' => 150,
  ),
  251234564526 => 
  array (
    'account' => 251234564526,
    'price' => 180,
  ),
)

答案 3 :(得分:0)

@Jeroen Noten你的答案对我有用,但我已经像我一样解决了这个问题,

$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;
       }
}

我认为这是 性能明智的

的最佳解决方案

谢谢

答案 4 :(得分:0)

这是我的解决方案。你可以试试这个

{{1}}

https://eval.in/506410