在PHP中循环数组和聚合结果的更优雅方式

时间:2015-01-28 18:48:51

标签: php arrays loops

我需要遍历一组数据(下面的示例)并生成聚合。原始数据格式为CSV(但也可以是其他类型)。

LOGON;QUERY;COUNT
L1;Q1;1
L1;Q1;2
L1;Q2;3
L2;Q2;1

我需要通过LOGON和QUERY对数量进行分组,所以最后我会得到一个类似的数组:

"L1-Q1" => 3,
"L1-Q2" => 3,
"L2-Q1" => 1,

我通常使用这样的代码:

$logon = NULL;
$query = NULL;
$count = 0;
$result = array();

// just imagine I get each line as a named array
foreach ($csvline as $line) { 
    if ($logon != $line['logon'] || $query != $line['query']) {
         if ($logon !== NULL) {
              $result[$logon . $query] = $count;
         }

         $logon = $line['logon'];
         $query = $line['query'];
         $count = 0;
    }

    $count += $line['count'];
}

$result[$logon . $query] = $count;

真诚地,我不认为这很好,因为我必须重复最后一句话以包括最后一行。那么,有没有更优雅的方法在PHP中解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:3)

您只需要检查是否存在密钥,然后递增 - 随时创建缺失密钥,值为0.

然后你不需要在任何时候重复任何事情:

$result = array();

foreach ($csvline as $line) { 
    if (!isset($result[$line['logon'] . $line['query']])){
       //create entry
       $result[$line['logon'] . $line['query']] = 0; 
    }

    //increment, no matter what we encounter
    $result[$line['logon'] . $line['query']] += $line['count']; 
}

为了便于阅读和避免错误,您应该只生成一次密钥,而不是一遍又一遍地执行相同的连接:

foreach ($csvline as $line) { 

   $curKey = $line['logon'] . $line['query'];

   if (!isset($result[$curKey])){
       //create entry
       $result[$curKey] = 0; 
    }

    //increment, no matter what we encounter
    $result[$curKey] += $line['count']; 
}

这将允许您重构密钥而无需触及几行代码。