【问题标题】:Count specific condition within an if statement计算 if 语句中的特定条件
【发布时间】: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


    【解决方案1】:

    ||= 具有更高的优先级,所以即使有括号,你仍然会吸收整个语句。稍微移动一下左括号:

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

    【讨论】:

    • 天啊,就是这样!没想到我这么近!!!那个可怕的细节记录在哪里?这是我第一次听说!
    • 我假设您熟悉优先级(在 3+4*5 中它首先进行乘法运算)。在允许在表达式中使用= 的语言(如C)中,= 的优先级最低是很常见的。毕竟,在赋值语句中,您希望 x = complicated-expression 吸收右侧的所有内容。
    • 我当然知道数学优先级,甚至编程中的优先级;但这是我第一次听说在 PHP 中,赋值 = 的优先级低于 OR || 或 AND &&,这在你上一条评论中的表达方式是有道理的,尽管我从未想过它之前。非常感谢你!
    猜你喜欢
    • 2022-01-19
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多