计数if语句中的特定条件



在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。

我们还可以说,在前两批中,我们没有依次遇到列入黑名单的物品,也没有遇到没有有效图像的物品。那么跳过的$counter应该是0。

在第三批中,让我们假设我们命中了1个列入黑名单的项目和2个缺少图像的项目。在此批次中,计数器为3。

啊,我忘了提到,在每次迭代中,批处理都是从头开始的,已经完成的项目在脚本的另一部分得到处理。

因此,在第四批中,我们又发现了1个列入黑名单的项目,以及6个图像缺失的项目。现在,计数器应该读取10(上一批的3加上本批的7(。

等等…

相反,上面第一次运行的代码说跳过90(记住ITERATIONS_PER_LOOP设置为10(。第二批显示80。

在第三批中,它会显示67(它会显示70,但从中减去3个真正跳过的,所以它显示67(。。。

我在这里做错了什么?

||的优先级高于=,因此即使使用了括号,您仍然会占用整个语句。只需稍微移动打开的paren:

if (($skip = in_array($publication, $blacklist) || !remote_file_exists($remote['frontpage']['url']))
|| $iterations >= ITERATIONS_PER_LOOP) {

最新更新