【问题标题】:Sum the elements of an array key in a multidimensional array对多维数组中数组键的元素求和
【发布时间】:2016-06-07 13:09:42
【问题描述】:

这是我的数组

[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'];
        }
    }

【问题讨论】:

  • 我试过的这个方法的输出是什么?
  • 刚刚在这里回答了这个问题。可以很容易地适应您的需求stackoverflow.com/questions/37675819/…
  • 另一个问题:你的数组总是按日期排序吗?
  • @HenriqueBarcelos 是的
  • @atoms 从你的回答中得到提示,如果我像这样动态设置数组的键,为什么会出现未定义索引的错误 $aSortedArray[$aArray['source']][] = array( 'target' => $aArray['target'], 'total_volume' => $aArray['total_volume'] );

标签: php php-5.4


【解决方案1】:

这应该可以工作,它并不理想,因为您在每个数组上循环两次,随着数组变大,这将成倍减慢。

$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);

【讨论】:

  • 感谢您的客气话。有很多更好,更有效的方法。如果您打算将它用于大型数据集,请小心
【解决方案2】:

我对@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);

【讨论】:

    【解决方案3】:
    $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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多