php 按一列对2d数组数据分组,并对每组中的其他列求和(分别)

pvcm50d1  于 2023-01-16  发布在  PHP
关注(0)|答案(4)|浏览(137)

我需要将索引数组的索引数组中的数据按第一列的值(id列)进行分组,在每个分组中,我需要求出第二列的和,并求出第三列的和。
样品输入:

[
    [111, 5, 3],
    [111, 3, 7],
    [111, 2, 1],
    [222, 5, 3],
]

预期结果:

[
    111 => [10, 11]
    222 => [5, 3]
]
pokxtpni

pokxtpni1#

你必须使用一个循环来手动完成这个操作。类似下面的代码应该可以工作:

$result = array();

foreach( $input as $row) {
    $id = array_shift( $row);

    foreach( $row as $key => $value) {

        $result[ $id ][ $key ] = 
            ( isset( $result[ $id ][ $key ]) ? 
                  $result[ $id ][ $key ] + $value : 
                  $value
            );
    }
}
    • 输出:**
array(2) {
  [111]=>
  array(2) {
    [0]=>
    int(10)
    [1]=>
    int(11)
  }
  [222]=>
  array(2) {
    [0]=>
    int(5)
    [1]=>
    int(3)
  }
}

Demo

bogh5gae

bogh5gae2#

保持简单

foreach ($arrays as $array) {

    $final[$array[0]] = array(
        @$final[$array[0]][0] + $array[1],
        @$final[$array[0]][1] + $array[2]
    );
}

http://codepad.org/lCCXHjKR

gojuced7

gojuced73#

代码

// This is your input.
$Input[] = array(
  0=>111, //id
  1=>5,   //value to ad
  2=>3   //value to ad
);
$Input[] = array(
  0=>111,
  1=>3,
  2=>7   
);
$Input[] = array(
  0=>111,
  1=>2,
  2=>1   
);
$Input[] = array(
  0=>222,
  1=>5,
  2=>3   
);

// This is your output.
$Output = array();
for($i=0; $i<count($Input); $i++)
{
    $id = $Input[$i][0];

    // If key already exists...
    if(array_key_exists($id, $Output))
    {
        // Sum it.
        $Output[$id][0] += $Input[$i][1];
        $Output[$id][1] += $Input[$i][2];
    }
    // If not...
    else
    {
        // Initialize it.
        $Output[$id][0] = $Input[$i][1];
        $Output[$id][1] = $Input[$i][2];
    }
}

// This is your output dumped.
print_r($Output);

输出

Array
(
    [111] => Array
        (
            [0] => 10
            [1] => 11
        )

    [222] => Array
        (
            [0] => 5
            [1] => 3
        )

)

附加注解

关键是使用array_key_exists检查数组中是否已经存在索引。

dnph8jn4

dnph8jn44#

一个简洁,使用语言构造的现代方法是使用foreach()迭代inout数组,并在添加相关数据点时利用空合并运算符。这可以防止由于尝试向未声明的变量添加值而导致的任何警告。应避免使用@符号来隐藏错误,因为它表示愿意忽略来自服务器的有意义的反馈(而且开发人员通常认为不必要的错误抑制会给代码带来不好的味道)。
代码:(Demo

$result = [];
foreach ($array as $row) {
    $result[$row[0]][0] = ($result[$row[0]][0] ?? 0) + $row[1];
    $result[$row[0]][1] = ($result[$row[0]][1] ?? 0) + $row[2];
}
var_export($result);

array_reduce()提供了与函数替代相同的结果,这也防止了在全局作用域中声明变量。
代码:(Demo

var_export(
    array_reduce(
        $array,
        function($result, $row) {
            $result[$row[0]][0] = ($result[$row[0]][0] ?? 0) + $row[1];
            $result[$row[0]][1] = ($result[$row[0]][1] ?? 0) + $row[2];
            return $result;
        }
    )
);

相关问题