加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 在foreach中对数组中的项目进行分组和求和

发布时间:2020-12-13 16:57:05 所属栏目:PHP教程 来源:网络整理
导读:我循环遍历两个存储过程的结果集,根据另一个存储过程中的字段获取结果. 包含结果集的两个数组是$customers和$subcustomers. foreach($customers as $customer){ foreach($subcustomers as $subcustomer) { if($subcustomer['parent'] == $customer['id']) {
我循环遍历两个存储过程的结果集,根据另一个存储过程中的字段获取结果.

包含结果集的两个数组是$customers和$subcustomers.

foreach($customers as $customer)
{
      foreach($subcustomers as $subcustomer)
      {
            if($subcustomer['parent'] == $customer['id'])
            {                        
                  if($customer['innumber'] == null && $subcustomer['innumber'] != null)
                  {                       
                      $chartInboundSub['name'] = $customer['name'];
                      $chartInboundSub['label'] = $subcustomer['innumber'];
                      $chartInboundSub['countInbound'] = $customer['count'];
                      $chartInboundSub['minsInbound'] = ceil($customer['duration'] / 60);
                      $chartInboundSub['customerid'] = $customer['id'];

                      array_push($out['chartInbound'],$chartInboundSub);
                  }
            }
       }
}

print_r的当前输出($out [‘chartInbound’])如下:

Array
(
    [0] => Array
        (
            [countInbound] => 426
            [minsInbound] => 340
            [name] => Telekomm
            [label] => 01-02
            [customerid] => 6
        )

    [1] => Array
        (
            [countInbound] => 1
            [minsInbound] => 2
            [name] => Telekomm
            [label] => 01-02
            [customerid] => 6
        )

    [2] => Array
        (
            [countInbound] => 3
            [minsInbound] => 21
            [name] => Telekomm
            [label] => 080
            [customerid] => 6
        )

    [3] => Array
        (
            [countInbound] => 1920
            [minsInbound] => 15766
            [name] => Telekomm
            [label] => 084
            [customerid] => 6
        )

    [4] => Array
        (
            [countInbound] => 2332
            [minsInbound] => 17521
            [name] => Telekomm
            [label] => 084
            [customerid] => 6
        )
    ...
)

上述结果需要按名称,标签,customerid与countInbound和minsInbound求和进行分组,因此:

期望的输出应该是:

Array
    (
        [0] => Array
            (
                [countInbound] => 427
                [minsInbound] => 342
                [name] => Telekomm
                [label] => 01-02
                [customerid] => 6
            )

        [1] => Array
            (
                [countInbound] => 3
                [minsInbound] => 21
                [name] => Telekomm
                [label] => 080
                [customerid] => 6
            )

        [2] => Array
            (
                [countInbound] => 4252
                [minsInbound] => 33287
                [name] => Telekomm
                [label] => 084
                [customerid] => 6
            )
        ...
    )

解决方法

我认为这应该有效.我没有测试过代码,所以我没有做出任何承诺.

$map = array();
$i = 0;

foreach($customers as $customer)
{
      foreach($subcustomers as $subcustomer)
      {
            if($subcustomer['parent'] == $customer['id'])
            {                        
                  if($customer['innumber'] == null && $subcustomer['innumber'] != null)
                  {                       

                      $key = $customer['name'] . '/' . $subcustomer['innumber'] . '/' . $customer['id'];

                      if(isset($map[$key])) {
                            $out['chartInbound'][$map[$key]]['countInbound'] += $customer['count'];
                            $out['chartInbound'][$map[$key]]['minsInbound'] += ceil($customer['duration'] / 60);
                      }
                      else {
                          $out['chartInbound'][$i] = array(
                                  'name' => $customer['name'],'label' => $subcustomer['innumber'],'countInbound' => $customer['count'],'minsInbound' => ceil($customer['duration'] / 60),'customerid' => $customer['id'],);
                          $map[$key] = $i++;
                    }
                  }
            }
       }
}

对于name,label和customerid的每个组合,它会创建一个字符串键,该键对于该组合??必须是唯一的.然后它检查是否已存在该密钥的任何数据(通过在$out [‘chartInbound’]中保留单独的密钥及其索引列表).如果是这样,它只会添加countInbound和minsInbound.如果没有,它将整个$chartInboundSub放入$out [‘chartInbound’].

请注意,这取决于密钥的独特性.例如,如果您允许/使用可能不是这种情况的名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读