简化PHP或语句

时间:2011-02-20 23:00:32

标签: php

好的,我相信我可以简化这行代码,除了我在网上找不到任何东西。任何人都可以帮助我吗?

if(empty($action) || $action == "a" || $action == "b" || $action == "c") {
}

谢谢!

4 个答案:

答案 0 :(得分:7)

您可以使用in_array()搜索$action的可能值数组:

if (empty($action) || in_array($action, array('a', 'b', 'c'))) {
}

我将empty()条件分开,因为除了空字符串empty()之外,''对于许多内容测试为true。

如果您只关心测试空字符串,可以将其包含在in_array()中,并删除empty()

if (in_array($action, array('', 'a', 'b', 'c'))) {
}

由于short-circuiting,我认为明确地包括empty()明显更好一点。

答案 1 :(得分:1)

$options = array("a", "b", "c");
if (empty($action) || in_array($action, $options) ) {
}

答案 2 :(得分:1)

我建议你不要简化这段代码,因为你可能会获得某种可读性,但是你也会增加计算时间。而且我更愿意提高可读性(代码执行的频率远远超过纯文本阅读)。

为什么?

只有or个连词组成的像你这样的表达式才会在找到第一个'true'值时结束。因此,在最好的情况下,PHP将仅使用empty($action)评估true并保留if-header而不评估所有其他部分。在最坏的情况下,它将检查每个部分直到结束。因此,平均而言 - 如果没有进一步了解您将检查的数据 - 您正在运行并计算if-header的一半。

但是如果你使用in_array($action, array('a', 'b', 'c'))之类的东西,那么你将用所有元素构造整个数组并在其中搜索。因此,您的PHP解释器必须创建所有元素和数组,以匹配第一个元素之一。无论如何,这比你当前的线还要多。

所以请先考虑一下readabilty与代码复杂性。

答案 3 :(得分:0)

if (empty($action) || preg_match('/^[abc]$/', $action)) { ... }
需要

修改: empty($action)才允许falsearray()0null通过不想要。