我需要将索引数组的索引数组中的数据按第一列的值(id列)进行分组,在每个分组中,我需要求出第二列的和,并求出第三列的和。样品输入:
[ [111, 5, 3], [111, 3, 7], [111, 2, 1], [222, 5, 3], ]
预期结果:
[ 111 => [10, 11] 222 => [5, 3] ]
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
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
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检查数组中是否已经存在索引。
dnph8jn44#
一个简洁,使用语言构造的现代方法是使用foreach()迭代inout数组,并在添加相关数据点时利用空合并运算符。这可以防止由于尝试向未声明的变量添加值而导致的任何警告。应避免使用@符号来隐藏错误,因为它表示愿意忽略来自服务器的有意义的反馈(而且开发人员通常认为不必要的错误抑制会给代码带来不好的味道)。代码:(Demo)
foreach()
@
$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)
array_reduce()
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; } ) );
4条答案
按热度按时间pokxtpni1#
你必须使用一个循环来手动完成这个操作。类似下面的代码应该可以工作:
Demo
bogh5gae2#
保持简单
http://codepad.org/lCCXHjKR
gojuced73#
代码
输出
附加注解
关键是使用array_key_exists检查数组中是否已经存在索引。
dnph8jn44#
一个简洁,使用语言构造的现代方法是使用
foreach()
迭代inout数组,并在添加相关数据点时利用空合并运算符。这可以防止由于尝试向未声明的变量添加值而导致的任何警告。应避免使用@
符号来隐藏错误,因为它表示愿意忽略来自服务器的有意义的反馈(而且开发人员通常认为不必要的错误抑制会给代码带来不好的味道)。代码:(Demo)
array_reduce()
提供了与函数替代相同的结果,这也防止了在全局作用域中声明变量。代码:(Demo)