PHP while循环统计重复账号出现次数计数结果异常问题
PHP循环统计账号出现次数异常问题排查
问题背景
现有一段从数据库轮询拉取数据的脚本,需求为在while loop内统计重复出现账号的出现次数,但运行后计数结果始终和拉取到的总记录数挂钩,不符合预期。
经测试数据核对:客户号100001实际仅出现4次,但当前while循环执行过程中,该账号及其他账号的计数随遍历的总记录数同步增长,输出结果异常。
原有实现代码
$itemArray = array(); $check = array(); $amount = array(); while ($row = sqlsrv_fetch_array($empRecords, SQLSRV_FETCH_ASSOC)) { $itemArray[] = $row['ac_no']; $amount[] = $row['accountBalance']; foreach ($itemArray as $cust_no) { if (isset($result[$cust_no])) { $result[$cust_no]++; } else { $result[$cust_no] = 1; } } foreach ($result as $cust_no => $count) { echo "{$cust_no}: {$count}" . "<br/>"; } }
核心逻辑错误
- 计数逻辑位置错误:每读取1条新记录,就遍历**全量历史账号数组
$itemArray**给所有账号计数+1,而非仅给当前新读取到的单条账号计数。假设共读取n条记录,第k次循环时数组长度为k,所有已存入数组的账号都会被重复累加,最终计数和真实出现次数完全无关,只会随总记录数线性增长。 - 输出时机错误:在while循环内部就输出计数结果,此时数据拉取和计数尚未完成,输出的是每轮错误累加的中间值,而非最终统计结果。
- 冗余代码问题:定义了
$check变量但全程未使用,属于无效声明。
修正后代码
$itemArray = array(); $amount = array(); $result = array(); while ($row = sqlsrv_fetch_array($empRecords, SQLSRV_FETCH_ASSOC)) { $currentAcNo = $row['ac_no']; $itemArray[] = $currentAcNo; $amount[] = $row['accountBalance']; // 仅对当前读取到的单条账号做计数更新 if (isset($result[$currentAcNo])) { $result[$currentAcNo]++; } else { $result[$currentAcNo] = 1; } } // 所有数据处理完成后统一输出统计结果 foreach ($result as $cust_no => $count) { echo "{$cust_no}: {$count}" . "<br/>"; }
内容的提问来源于stack exchange,提问作者Oluremi Adefila
相关产品推荐
相关产品推荐

