【问题标题】:Quickest PHP equivalent of javascript `var a = var1||var2||var3;` expression最快的 PHP 等效于 javascript `var a = var1||var2||var3;` 表达式
【发布时间】:2016-07-26 19:43:18
【问题描述】:

首先这个表达式有名字吗?

Javascript

var value = false || 0 || '' || !1 || 'string' || 'wont get this far';

value 等于 string(字符串)也就是第五个选项

PHP

$value = false || 0 || '' || !1 || 'string' || 'wont get this far';

$value 等于 true(布尔值)

我认为通过嵌套三元运算符实现与 JavaScript 相同结果的正确方法是否正确?什么是最好的解决方案?

【问题讨论】:

  • 只有true..测试echo true;
  • 你可能想检查一下this
  • 在 JS 中它们被称为短路评估
  • <?php $value = false || 0 || '' || true || 'wont get this far'; echo $value===true?'true':$value; ?>
  • @BlazeSahlzen 谢谢了解正确的术语有很大帮助。

标签: javascript php ternary-operator


【解决方案1】:

此测试false || 0 || '' || !1 || true || 'wont get this far' 将返回一个布尔值。如果任何值是true,它将返回true,这就是OR 的工作方式。它不是三元表达式,它将第一个有效值应用于接收变量。

它将1 返回给 PHP,因为您没有将表达式转换为布尔值。

你可以这样做让表达式返回一个布尔值而不是一个整数到你的 PHP 变量中:

$value = (bool)(false || 0 || '' || !1 || true || 'wont get this far');`

返回将是true

【讨论】:

  • ".. || .. 将返回一个布尔值...", "你可以这样做让表达式返回一个布尔值..." – 它是什么? || 是否返回布尔值?
  • 它确实返回一个布尔值,但不直接返回到变量中,在 PHP 中没有。我没有得到这两个反对票,但没关系
  • 什么?它要么返回布尔值,要么不返回。是否将返回值分配给变量没有区别。一个值就是一个值。 || 的布尔返回值不会通过强制转换得到任何布尔值。
【解决方案2】:

PHP中等价的运算符是?:,也就是没有中间部分的ternary operator

$value = false ?: 0 ?: '' ?: !1 ?: 'string' ?: 'wont get this far';

$a ?: $b$a ? $a : $b 的简写。

【讨论】:

  • 我认为问题不在于三元运算符。但是 OP 混淆地称为三元运算符而不是短路评估。
  • 在 Javascript 中 || 返回 它的一个操作数,而不是布尔值。在 PHP 中执行此操作的等效方法是 ?:。问题已回答。
  • 感谢您的解释。我在假设别的东西。
  • OP并没有混淆,OP只是建议使用三元来实现结果。
  • 刚刚意识到......并删除了我的答案以支持这个答案。
【解决方案3】:

如果您使用的是 PHP 5.3 或更高版本,请参阅deceze's answer

否则,您可以使用嵌套的常规三元运算符。

$value = ( false ? false : ( 0 ? 0 : ( '' ? '' : ( !1 ? !1 : ( 'string' ? 'string' : ( 'wont get this far' ? 'wont get this far' : null )))))); 

哇,真丑。

您可以改为使用值数组;

$array = array(false,0,'',!1,'string','wont get this far'));

现在创建一个遍历数组并返回第一个真值的函数。

function array_short_circuit_eval($vars = array()){
    foreach ($vars as $var)if($var)return $var;return null;
}

$value = array_short_circuit_eval($array);

echo $value; // string

【讨论】:

  • $value = current(array_filter(array(false, 0, ...))) - 我希望没有人需要使用它,但它在这里......
猜你喜欢
  • 1970-01-01
  • 2015-06-17
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2020-07-13
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多