【问题标题】:Accumulative total foreach loop, using variable to group numbers [duplicate]累积总foreach循环,使用变量对数字进行分组[重复]
【发布时间】:2018-02-21 12:54:29
【问题描述】:

我需要关于 foreach 和 PHP 数组的帮助

假设我有以下数组:

$orders = array (
  0 => 
    array (
      'company' => 'Company 1',
      'total' => '5',
    ),
  1 => 
    array (
      'company' => 'Company 2',
      'total' => '10',
    ),
  2 => 
    array (
      'company' => 'Company 1',
      'total' => '15',
    ),
  3 => 
    array (
      'company' => 'Company 1',
      'total' => '5',
    ),
  4 => 
    array (
      'company' => 'Company 3',
      'total' => '12',
    )
);

公司 1 的订单 1 是 5
公司 2 的订单 2 是 10
公司 1 的订单 3 是 15
公司 2 的订单 4 是 5
公司 3 的订单 5 是 12

我希望输出显示公司名称和每个公司订单的累计总数

例如:

Company 1           20
Company 2           15
Company 3           12

【问题讨论】:

  • 您的输入中没有Company 3
  • Company 1 应该是 20,而不是 25?
  • 感谢 RomanPerekherst 和 kerbholz;纠正了这些。关于重复,这绝对是其中的一部分,但是这个问题缺少我需要根据公司变量进行积累的部分

标签: php arrays


【解决方案1】:

array_reduce()解决方案:

$groups = array_reduce($orders, function($r, $a) {
   $k = $a['company'];
   (isset($r[$k]))? $r[$k] += $a['total'] : $r[$k] = $a['total'];
   return $r;
}, []);

foreach ($groups as $k => $v) {
    printf("%-20s%d\n", $k, $v);
}

输出:

Company 1           25
Company 2           10
Company 3           12

【讨论】:

    【解决方案2】:

    只需创建另一个将跟踪订单的数组。

    $companies = array();
    foreach ($orders as $order) {
        if (array_key_exists($order["company"], $companies)) {
            $companies[$order["company"]] += $order["total"];
        } else {
            $companies[$order["company"]] = $order["total"];
        }
    }
    

    首先,我们检查公司是否已经在公司数组中,如果是,那么我们将总数添加到该公司的当前总数中。
    否则,我们只需创建一个新密钥并存储总数。

    此外,您可以编写(int)$order["total"] 以将类型转换为整数。
    这可能有助于确保您拥有正确的数据。

    【讨论】:

    • 这是完美的解决方案!非常感谢。值得注意的是,我随后成功地使用了 uasort 对数组进行了排序。
    【解决方案3】:

    使用 foreach 循环来增加一些变量的一种方法:

    // Your array
    $array = array(...);
    
    // Init of the sum of each total for each company
    $c1 = 0;
    $c2 = 0;
    $c3 = 0;
    
    // You loop through your array and test the output
    foreach ($array as $order => $value_array) {
        switch($value_array['company']) {
            case 'Company 1' : $c1 += intval($value_array['total']); break;
            case 'Company 2' : $c2 += intval($value_array['total']); break;
            case 'Company 3' : $c3 += intval($value_array['total']); break;
        }
    }
    
    //$c1 will be the sum for company 1;
    //$c2 for the company 2;
    //$c3 for the company 3.
    

    这是你要找的吗?

    【讨论】:

    • 我编辑了它:)
    【解决方案4】:

    另一种方式:array_walk

    $result = array();
    array_walk($orders, function ($element) use (&$result) {
        $company = $element['company'];
        if (!isset($result[$company]))
            $result[$company] = 0;
        $result[$company] += $element['total'];
    });
    

    对于这个输入:

    $orders = array(
        0 =>
            array(
                'company' => 'Company 1',
                'total' => '5',
            ),
        1 =>
            array(
                'company' => 'Company 2',
                'total' => '10',
            ),
        2 =>
            array(
                'company' => 'Company 1',
                'total' => '15',
            ),
        3 =>
            array(
                'company' => 'Company 1',
                'total' => '5',
            ),
        4 =>
            array(
                'company' => 'Company 3',
                'total' => '12',
            )
    );
    

    输出将是:

    array(3) {
      ["Company 1"]=>
      int(25)
      ["Company 2"]=>
      int(10)
      ["Company 3"]=>
      int(12)
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 1970-01-01
      • 2018-08-07
      • 2019-08-15
      • 2013-10-20
      • 2023-03-10
      • 1970-01-01
      • 2021-10-11
      • 2014-06-13
      相关资源
      最近更新 更多