【问题标题】:Summing objects property in array对数组中的对象属性求和
【发布时间】:2021-03-22 17:16:10
【问题描述】:

我有一个对象数组,我想对其中一个属性的值求和,例如:

Array
(
[0] => stdClass Object
    (
        [name] => jon
        [commission] => 5

    )
[1] => stdClass Object
    (
        [name] => smith
        [commission] => 1

    )
[2] => stdClass Object
    (
        [name] => philip
        [commission] => 8

    )
)  

我想对数组中的所有佣金求和,结果应该是 14。

有什么好的方法呢?

【问题讨论】:

    标签: php


    【解决方案1】:

    array_reduce 可能是一种方法;只需添加您的$array

    $sum = array_reduce($array, function($carry, $item)
    {
        return $carry + $item->commission;
    });
    
    var_dump($sum);
    

    【讨论】:

    • 回调中是否需要使用+=操作符?我想可能只是+
    • 漂亮的解决方案!
    【解决方案2】:

    如果您使用的是 PHP 5.5

    $arr_new = array_sum(array_column($yourarray, 'commission'));
    

    【讨论】:

    • OP 有一个对象,而不是数组。
    • 是的,但如果对象属性是公开的,这将以类似的方式工作。
    【解决方案3】:

    假设 $arr 存储您的信息。实现以下功能:

    function sumProperties(array $arr, $property) {
    
        $sum = 0;
    
        foreach($arr as $object) {
            $sum += isset($object->{$property}) ? $object->{$property} : 0;
        }
    
        return $sum;
    }
    

    之后您只需致电sumProperties($array, 'commission')

    此外,如果您有更多可以汇总的属性,您可以用这些属性替换佣金。

    【讨论】:

      【解决方案4】:
      $sum = 0;
      foreach($arrObj as $key=>$value){
        if(isset($value->commission))
           $sum += $value->commission;
      }
      echo $sum;
      

      【讨论】:

      • 如果数组中的某些对象不包含佣金或佣金为空怎么办?
      【解决方案5】:

      IMO 最干净的解决方案是使用 reduce:

      $total = array_reduce( commissionsArray, function ($sum, $entry) {
        $sum += $entry->commission;
        return $sum;
      }, 0);
      

      您可以在这里查看:
      https://wtools.io/php-sandbox/b4nG

      但是,如果你的数组包含数组而不是对象,你可以使用可读的代码(如果你的 php 版本早于 8.0.0,它适用于对象,但它不是一个很好的练习使用隐式转换):

      array_sum(array_column($commissionsArray, 'importe_final'));
      

      您可以在这里查看:
      https://wtools.io/php-sandbox/b4nK

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 2022-09-23
        • 2012-07-01
        相关资源
        最近更新 更多