Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中更优雅地循环数组和聚合结果_Php_Arrays_Loops - Fatal编程技术网

在PHP中更优雅地循环数组和聚合结果

在PHP中更优雅地循环数组和聚合结果,php,arrays,loops,Php,Arrays,Loops,我需要遍历一组数据(下面的示例)并生成一个聚合。原始数据格式为CSV(但也可以是其他类型) 我需要通过登录和查询对数量进行分组,因此最后我会有一个如下数组: "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 ar

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

我需要通过登录和查询对数量进行分组,因此最后我会有一个如下数组:

"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中有没有更优雅的方法来解决这个问题呢


谢谢

您只需检查是否存在一个键,然后随时使用值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']; 
}

这将允许您在不接触几行代码的情况下重构密钥。

这可能是一个更好的问题:好主意,也许您是对的。我还有另外一个问题要问,但是狗鼻子的回答是正确的,所以我接受了。无论如何谢谢你!你的回答是对的,我几分钟后就接受了,因为我现在不同意。然而,读完它之后,我意识到我还有一个与之相关的问题。谢谢关于钥匙的提示很好
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']; 
}