对多维数组中数组键的元素求和
Sum the elements of an array key in a multidimensional array
这是我的数组
[Company] => Array
(
[0] => Array
(
[date] => 2016-05-28
[revenue] => 55
)
[1] => Array
(
[date] => 2016-05-28
[revenue] => 101
)
[2] => Array
(
[date] => 2016-05-29
[revenue] => 55
)
[3] => Array
(
[date] => 2016-05-29
[revenue] => 101
)
[4] => Array
(
[date] => 2016-05-30
[revenue] => 60
)
[5] => Array
(
[date] => 2016-05-30
[revenue] => 60
)
[6] => Array
(
[date] => 2016-05-31
[revenue] => 29
)
[7] => Array
(
[date] => 2016-05-31
[revenue] => 60
)
)
我需要这样总结
[Company] => Array
(
[0] => Array
(
[date] => 2016-05-28
[revenue] => 151
)
*
*etc.
)
我试过各种方法都不行。我尝试了下面的方法,但效果不佳
foreach($data as $key => $value) {
foreach ($value as $row) {
$res[$key][$row['date']] += $row['revenue'];
}
}
$revenue_sum=0;
$elements_sum=0;
foreach($data as $key => $value) { // 1st dimension
foreach ($value as $key2 => $value2) { // 2nd dimension
if ($key2 == "revenue") {
$revenue_sum += $value2;
}
$elements_sum++;
}
}
echo "Revenue sum: ".$total_sum;
echo "Elements sum: ".$elements_sum;
这应该可行,但它并不理想,因为您在每个数组上循环两次,随着数组变大,速度会呈指数级下降。
$aStartingArray = array();
$aSortedArray = array();
$aStartingArray[] = array('date'=>'2016-05-28', 'revenue' => 55);
$aStartingArray[] = array('date'=>'2016-05-28', 'revenue' => 101);
$aStartingArray[] = array('date'=>'2016-05-29', 'revenue' => 55);
$aStartingArray[] = array('date'=>'2016-05-29', 'revenue' => 101);
$aStartingArray[] = array('date'=>'2016-05-30', 'revenue' => 60);
$aStartingArray[] = array('date'=>'2016-05-30', 'revenue' => 60);
$aStartingArray[] = array('date'=>'2016-05-31', 'revenue' => 29);
$aStartingArray[] = array('date'=>'2016-05-31', 'revenue' => 60);
// loop through the initial array
foreach ($aStartingArray as $aArray) {
// set flag to reference if its been dealt with
$bSet = false;
// foreach of the sorted values, check if the date matches an entry
foreach ($aSortedArray as $iPos => $aTempSortedArray) {
if( $aTempSortedArray['date'] == $aArray['date'] ){
// match found, add revenue
$aSortedArray[$iPos]['revenue'] += $aArray['revenue'];
// set flag to illustrate a dealt with row
$bSet = true;
}
}
// if still hasnt been dealt with, go add it to the array
if(!$bSet){
$aSortedArray[] = array( 'date' => $aArray['date'], 'revenue' => $aArray['revenue'] );
}
}
var_dump($aSortedArray);
我对@atoms 的回答没有异议,
但它将在一个 foreach
中完成
$newArr = array();
foreach($arr['Company'] as $key => $value) {
if(isset($newArr[$value['date']])){
$newArr[$value['date']]['revenue'] = $newArr[$value['date']]['revenue'] + $value['revenue'];
} else {
$newArr[$value['date']] = $value;
}
}
$newArr = array_values($newArr);
这是我的数组
[Company] => Array
(
[0] => Array
(
[date] => 2016-05-28
[revenue] => 55
)
[1] => Array
(
[date] => 2016-05-28
[revenue] => 101
)
[2] => Array
(
[date] => 2016-05-29
[revenue] => 55
)
[3] => Array
(
[date] => 2016-05-29
[revenue] => 101
)
[4] => Array
(
[date] => 2016-05-30
[revenue] => 60
)
[5] => Array
(
[date] => 2016-05-30
[revenue] => 60
)
[6] => Array
(
[date] => 2016-05-31
[revenue] => 29
)
[7] => Array
(
[date] => 2016-05-31
[revenue] => 60
)
)
我需要这样总结
[Company] => Array
(
[0] => Array
(
[date] => 2016-05-28
[revenue] => 151
)
*
*etc.
)
我试过各种方法都不行。我尝试了下面的方法,但效果不佳
foreach($data as $key => $value) {
foreach ($value as $row) {
$res[$key][$row['date']] += $row['revenue'];
}
}
$revenue_sum=0;
$elements_sum=0;
foreach($data as $key => $value) { // 1st dimension
foreach ($value as $key2 => $value2) { // 2nd dimension
if ($key2 == "revenue") {
$revenue_sum += $value2;
}
$elements_sum++;
}
}
echo "Revenue sum: ".$total_sum;
echo "Elements sum: ".$elements_sum;
这应该可行,但它并不理想,因为您在每个数组上循环两次,随着数组变大,速度会呈指数级下降。
$aStartingArray = array();
$aSortedArray = array();
$aStartingArray[] = array('date'=>'2016-05-28', 'revenue' => 55);
$aStartingArray[] = array('date'=>'2016-05-28', 'revenue' => 101);
$aStartingArray[] = array('date'=>'2016-05-29', 'revenue' => 55);
$aStartingArray[] = array('date'=>'2016-05-29', 'revenue' => 101);
$aStartingArray[] = array('date'=>'2016-05-30', 'revenue' => 60);
$aStartingArray[] = array('date'=>'2016-05-30', 'revenue' => 60);
$aStartingArray[] = array('date'=>'2016-05-31', 'revenue' => 29);
$aStartingArray[] = array('date'=>'2016-05-31', 'revenue' => 60);
// loop through the initial array
foreach ($aStartingArray as $aArray) {
// set flag to reference if its been dealt with
$bSet = false;
// foreach of the sorted values, check if the date matches an entry
foreach ($aSortedArray as $iPos => $aTempSortedArray) {
if( $aTempSortedArray['date'] == $aArray['date'] ){
// match found, add revenue
$aSortedArray[$iPos]['revenue'] += $aArray['revenue'];
// set flag to illustrate a dealt with row
$bSet = true;
}
}
// if still hasnt been dealt with, go add it to the array
if(!$bSet){
$aSortedArray[] = array( 'date' => $aArray['date'], 'revenue' => $aArray['revenue'] );
}
}
var_dump($aSortedArray);
我对@atoms 的回答没有异议, 但它将在一个 foreach
中完成 $newArr = array();
foreach($arr['Company'] as $key => $value) {
if(isset($newArr[$value['date']])){
$newArr[$value['date']]['revenue'] = $newArr[$value['date']]['revenue'] + $value['revenue'];
} else {
$newArr[$value['date']] = $value;
}
}
$newArr = array_values($newArr);