只有真语句的条件运算符

6
我想要在条件为真时将一个变量设置为一个值。
不要执行以下操作:
if($myarray["foo"]==$bar){  
    $variablename=$myarray["foo"];  
}  

如果变量名很长,或者涉及到数组,以下操作可能会变得非常冗长,但其实我只是想在条件为真时设置一个值。

我想使用条件运算符,类似于这样:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"]......

但是这种方法失败了,因为如果语句为假,我根本不想设置变量。基本上,我试图让第一个示例更短。也许条件运算符不是正确的方法... 有没有人有什么建议?

你的第二个代码示例并没有比第一个更短(如果在第一个中删除换行符和花括号)。你仍然两次引用了数组...你到底希望从中获得什么? - Pavel Minaev
9个回答

13

比这更短的代码几乎不存在:

if($condition) $var = $value;

8

在我看来,让你的代码示例更短的最佳方法是:

if($myarray["foo"] == $bar)
    $variablename = $myarray["foo"];

顺便提一下,您所询问的运算符名称不是“三元运算符”,而是条件运算符

既然您问了,您可以使用条件运算符实际执行您要求的操作的方法如下:

$myarray['foo'] == $bar ? $variablename = $myarray['foo'] : null;

但那样做非常丑陋,也不易维护。


4
我认为始终使用大括号会更安全。 - Tom Haigh
8
只想指出一下,实际上这被称为三元运算符。http://ca.php.net/ternary#language.operators.comparison.ternary - Evert
Pfaugh. 这展示了Zend的水平。 - chaos
2
@Evert:并不完全是这样。在PHP的上下文中,“条件运算符”和“三元运算符”这两个术语是完全可以互换的,因为条件运算符是唯一的三元运算符。所以,在手册页面上作为标签,它是有效的。然而,这并不意味着它在“学术上”是正确的。如果PHP有第二个三元运算符,我们就不会讨论这个问题了。 - Peter Bailey

3
你可以这样做,但我不建议,因为这样做很难读懂,而且很愚蠢:

$myarray["foo"] == $bar ? $variablename = $myarray["foo"] : 0;

或者

$myarray["foo"] == $bar && $variablename = $myarray["foo"];

2

你是对的,三元运算符并不是最好的选择。它只能处理语句中的if和else部分。

最好还是使用常规的if语句。

if($myarray["foo"]==$bar) $variablename=$myarray["foo"];

2

你所面临的“问题”实际上并不是问题。你的示例代码非常清晰易懂,易于维护。我认为最好保持原样。

你可以删除大括号,但这会影响可维护性。

另一种选择是创建一个set_if_true(mixed array, string key, boolean conditional)包装函数。它隐藏了真正发生的事情,但取决于你具体的实现,这也是一个不错的选择。(例如配置类型对象或缓存后端)


同意。我会补充说,你(或其他人)可能需要为你正在处理的任何项目查阅编码标准。例如,Drupal 指出“即使在技术上是可选的情况下,也要始终使用花括号。这样做可以提高可读性,并降低添加新行时引入逻辑错误的可能性。” [来源] (https://drupal.org/coding-standards) - cdmo

2

使用!=替换==,并使用?:代替单独的?..

$variablename = ($myarray["foo"] != "bar") ?: $myarray["foo"];

是相当于

if($myarray["foo"] != "bar"){} else { $variablename = $myarray["foo"]; }

这可能不是最聪明的解决方案,但它可以工作。我更喜欢这个。

if($myarray["foo"] != "bar") {$variablename = $myarray["foo"]};

0

在假条件下将变量设置为其本身:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"] : $variablename

1
为什么要踩这个?这是完全有效的。 - Draemon
这不是有效的,很有可能会生成一个通知。 - Alex S
1
是的,它是有效的,它只有一个前提条件。如果变量可能没有被设置,有条件地设置变量是没有意义的。如果它没有被设置,并且您使用“if”方法,则会在下一步中引起问题-这比在错误点处发出通知更糟糕。 - Draemon

0

你可以将原始表达式放在三元操作符的else部分,但如果你想保证表达式只被计算一次,那么你就需要使用一个临时变量和一个if语句。


0

三元运算符并不是最好的选择,即使你可以编写出使用三元运算符的代码。

原因在于:你试图以一种它不被设计用来的方式使用它,这会让其他开发人员阅读你的代码时感到困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接