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