基于其他值的数组值求和


Sum values of an array based on other value

我有这个数组$city:

Array
(
    [0] => Array
        (
            [0] => fr
            [1] => paris
            [2] => FR-J
            [3] => 0
            [4] => 116729
            [5] => 0
            [6] => 0
        )
    [1] => Array
        (
            [0] => fr
            [1] => marseille
            [2] => FR-U
            [3] => 0
            [4] => 12898
            [5] => 0
            [6] => 0
        )
    [2] => Array
        (
            [0] => fr
            [1] => lyon
            [2] => FR-V
            [3] => 0
            [4] => 8608
            [5] => 0
            [6] => 0
        )
    [3] => Array
        (
            [0] => fr
            [1] => nice
            [2] => FR-U
            [3] => 0
            [4] => 6838
            [5] => 0
            [6] => 0
        )

等等……我想对$city[$key][4]求和,生成如下内容:

 Array
(
    [0] => Array
        (
            [0] => FR-J
            [1] => 116729
        )
    [1] => Array
        (
            [0] => FR-U
            [1] => 19736
        )
    [2] => Array
        (
            [0] => FR-V
            [1] => 8608
        )

我是这样做的:

$totals = array();
    foreach ($city as $key => $value) {
        if (isset($city[$key][3])){
            $totals[$key][0] = $city[$key][2];
            $totals[$key][1] += (int) $city[$key][4]; '' <-- this line
        } else {
            $totals[$key][0] = $city[$key][2];
            $totals[$key][1] = (int) $city[$key][4];
        }
    }

但是它生成了这个数组,但是在注释的行上有sum和Undefined offset: 1。我能帮上忙吗?感谢。

$sum = [];
foreach($city as $value) {
    if(!isset($sum[$value[2]]))
        $sum[$value[2]] = 0;
    $sum[$value[2]] += $value[4];
}
$results = [];
foreach($sum as $key => $value)
    $results[] = [$key,$value];
print_r($results);

为什么不先设置它,初始化为0呢?这样你就不会有未定义的索引错误。考虑这个例子:

$new_values = array();
foreach($original_values as $key => $value) {
    if(!isset($new_values[$value[2]][1])) $new_values[$value[2]][1] = 0;
    $new_values[$value[2]][0] = $value[2];
    $new_values[$value[2]][1] += $value[4];
}
$new_values = array_values($new_values);

这会解决你的问题。

$new_values = array();
foreach($original_values as $key => $value) {
      if(false == isset($new_values[$value[2]][1])) {
             $new_values[$value[2]][1] = 0;
       }
      $new_values[$value[2]][0] = $value[2];
      $new_values[$value[2]][1] += $value[4];
}
$new_values = array_values($new_values);

在if语句中也使用括号,这是我们社区的最佳实践

try this:

$totals = array();
foreach ($city as $key => $value) {
    $totals[$key][0] = $city[$key][2];
    if(!isset($totals[$key][1])) 
        $totals[$key][1] = 0;
    $totals[$key][1] += (int) $city[$key][4]; 
}