Php 每个循环的累计总数,使用变量对编号进行分组

Php 每个循环的累计总数,使用变量对编号进行分组,php,arrays,Php,Arrays,我需要有关PHP中的foreach和数组的帮助 假设我有以下数组: $orders = array ( 0 => array ( 'company' => 'Company 1', 'total' => '5', ), 1 => array ( 'company' => 'Company 2', 'total' => '10', ), 2 => ar

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

假设我有以下数组:

$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号公司的订单是5号
订单2对公司2是10
对于公司1,订单3为15
公司2的订单4是5
3号公司的5号订单是12号订单

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

例如:

Company 1           20
Company 2           15
Company 3           12

只需创建另一个数组来跟踪订单

$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”]
将类型转换为整数。

这可能有助于确保您拥有正确的数据。

一种方法是使用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.
这就是您要找的吗?

阵列减少()
解决方案:

$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
换一种方式:

对于此输入:

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

您的输入中没有
公司3
公司1
应该是20,而不是25?谢谢RomanPerekherst和kerbholz;纠正了这些问题。关于复制,这肯定是其中的一部分,但这个问题缺少我所拥有的部分,需要根据我编辑的公司变量进行积累:)这是一个完美的解决方案!谢谢。值得注意的是,我随后成功地使用uasort对数组进行排序。
array(3) {
  ["Company 1"]=>
  int(25)
  ["Company 2"]=>
  int(10)
  ["Company 3"]=>
  int(12)
}