PHP循环逻辑异常:批量邮箱区间生成结果不符预期,求排查
解决For循环生成邮箱批量区间的错误问题
嘿,我发现你代码里的问题了!问题出在循环更新$upper的那一行逻辑错误上,咱们代入数值走一遍就能明白为啥结果跑偏了:
你当前代码里,当$i != 0时更新$upper的语句是:
$upper= $upper+$lowe;
咱们算一遍具体数值:
- 第一次循环($i=0):
$lowe=0,$upper=999,完全符合预期 - 第二次循环($i=1):
$lowe=999+1=1000,$upper=999+1000=1999,这时候还没问题 - 第三次循环($i=2):
$lowe=1999+1=2000,但$upper=1999+2000=3999——这就超出你想要的2999了! - 后面的循环会因为这个错误的累加逻辑,让
$upper越来越离谱,直接翻倍往上走
两种修正方案
方案一:修复原有逻辑
只需要把更新$upper的语句改成基于当前$lowe计算,而不是用旧的$upper加$lowe:
$emails = array(); // 包含4600个邮箱的数组 $batch = ceil(count($emails)/1000); $lowe=0; $upper=$lowe+999; $ss = []; // 提前初始化数组更规范哦 for ($i=0; $i < $batch; $i++) { if ($i!=0) { $lowe=$upper+1; $upper= $lowe + 999; // 这里改成用当前下限+999得到上限 } $ss[]=['lower'=>$lowe,'upper'=>$upper]; } return $ss;
方案二:更简洁不易错的写法
其实完全不用维护$lowe和$upper的状态,直接用循环变量$i来计算区间,逻辑更清晰,还能自动处理最后一批不足1000个的情况:
$emails = array(); $totalEmails = count($emails); $batchSize = 1000; $ss = []; $totalBatches = ceil($totalEmails / $batchSize); for ($i=0; $i < $totalBatches; $i++) { $lower = $i * $batchSize; // 最后一批如果不足1000,取实际的最后一个索引(比如4600个邮箱的话,最后上限是4599) $upper = min($lower + $batchSize - 1, $totalEmails - 1); $ss[]=['lower'=>$lower,'upper'=>$upper]; } return $ss;
修正后的结果
用上面任意一种方案,都能得到你预期的结果:
[{"lower":0,"upper":999},{"lower":1000,"upper":1999},{"lower":2000,"upper":2999},{"lower":3000,"upper":3999},{"lower":4000,"upper":4999}]
内容的提问来源于stack exchange,提问作者Anthony Crevia Semps
相关产品推荐
相关产品推荐

