按一列对二维数组中的行进行分组并对另一列求和

问题描述 投票:0回答:3

所以我有二维数组,里面有一些数组。索引在数组中都是相同的:“id”和“cost”。在相同的“id”值上,我想对“number”值求和。 这是我的二维数组:

$array = array (
    array ('id' => 2, 'cost' => 300),
    array ('id' => 1, 'cost' => 200),
    array ('id' => 2, 'cost' => 100),
);

我已经编写了一些代码,但它并不完全是我想要的。

$result = array ();
foreach($array as $item){
  if (isset($result[$item['id']])){
      $result[$item['id']] += $item['cost'];
  }else{
      $result[$item['id']] = $item['cost'];
  }
}
var_dump($result);

会给我看这个:

array (size=2)
2 => int 400
1 => int 200

我想让它像这样给我看:

array (size=2)
 0 => 
  array (size=2)
  'id' => int 2
  'cost' => int 400
 1 => 
  array (size=2)
  'id' => int 1
  'cost' => int 200
php arrays multidimensional-array sum grouping
3个回答
0
投票

如果key不存在,可以用数组初始化。添加

cost
(如果它已经存在)。

$array = array (
    array ('id' => 2, 'cost' => 300),
    array ('id' => 1, 'cost' => 200),
    array ('id' => 2, 'cost' => 100),
);

$result = array ();
foreach($array as $item){
    if (isset($result[$item['id']])){
            //Add the cost
            $result[$item['id']]["cost"] += $item['cost'];
    } else {
            //Init as array
            $result[$item['id']] = array( "id" => $item['id'], "cost" => $item['cost'] );
    }
}

这将导致:

Array
(
    [2] => Array
        (
            [id] => 2
            [cost] => 400
        )

    [1] => Array
        (
            [id] => 1
            [cost] => 200
        )

)

0
投票

您可以使用

foreach
array_values
来获得想要的结果

$array = array (
        array ('id' => 2, 'cost' => 300),
        array ('id' => 1, 'cost' => 200),
        array ('id' => 2, 'cost' => 100),
);
$res = [];
foreach($array as $key => $value){

  array_key_exists($value['id'], $res) ? (
    $res[$value['id']]['cost'] += $value['cost']
  )
  :
  (
    $res[$value['id']] = [
        'id' => $value['id'],
        'cost' => $value['cost']
    ]
  );

}
echo '<pre>';
print_r(array_values($res));

结果

Array
(
[0] => Array
    (
        [id] => 2
        [cost] => 400
    )

[1] => Array
    (
        [id] => 1
        [cost] => 200
    )

)

现场演示


0
投票

如果你只在遇到唯一id时将引用变量压入结果数组,你就不需要调用

array_values()
在循环后重新索引结果。

代码:(演示

$result = [];
foreach ($array as $row) {
    if (!isset($ref[$row['id']])) {
        $ref[$row['id']] = $row;
        $result[] = &$ref[$row['id']];
    } else {
        $ref[$row['id']]['cost'] += $row['cost'];
    }
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.