【发布时间】:2021-04-07 19:15:53
【问题描述】:
在 PHP 脚本中,我以 ITERATIONS_PER_LOOP 的批次执行特定任务。在执行任务的 foreach 循环中,我有一个带有某些条件的 if 语句。问题是我想计算满足这些条件中的 2 个(它们都是 3 个)的时间。但我似乎找不到(优雅的)方法来做到这一点。请看下面的代码。
所以我原来是这样的:
if (in_array($publication, $blacklist) || !remote_file_exists($remote['frontpage']['url']) || $iterations >= ITERATIONS_PER_LOOP) {
continue;
}
我改成如下:
if ($skip = (in_array($publication, $blacklist) || !remote_file_exists($remote['frontpage']['url'])) || $iterations >= ITERATIONS_PER_LOOP) {
if ($skip) {
$skipped++;
}
continue;
}
这个想法是将满足前两个语句的条件分配给一个 var,然后计算 var - $skip - 被分配一个真值的次数。然而,这似乎并没有按预期工作,因为它不仅计算不存在的文件或列入黑名单的文件的出现次数,还计算将在下一个循环中发生的剩余迭代。
所以,假设我们有一批 100 个项目要处理,ITERATIONS_PER_LOOP 设置为 10。
假设在前 2 个批次中,我们没有依次遇到列入黑名单的物品,也没有遇到没有有效图像的物品。那么 $skipped 计数器应该是 0。
在第三批中,假设我们击中了 1 个列入黑名单的项目和 2 个缺少图像的项目。在这批中,计数器应该为 3。
啊,我忘了说在每次迭代中,批处理从头开始,已经完成的项目在脚本的另一部分处理。
因此,在第 4 批中,我们又发现了 1 个列入黑名单的商品,以及 6 个缺少图片的商品。现在计数器应该读取 10(前一批中的 3 个加上本批中的 7 个)。
等等等等……
相反,上面第一次运行的代码显示跳过 90(请记住 ITERATIONS_PER_LOOP 设置为 10)。在第二批中显示为 80。
在第 3 批中,它会显示 67(它会显示 70,但会从中减去 3 个真正跳过的,所以它会显示 67)...
我在这里做错了什么?
【问题讨论】:
标签: php if-statement conditional-statements