Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript的最快PHP等价物'var a=var1 | | var2 | | var3;`表达_Javascript_Php_Ternary Operator - Fatal编程技术网

javascript的最快PHP等价物'var a=var1 | | var2 | | var3;`表达

javascript的最快PHP等价物'var a=var1 | | var2 | | var3;`表达,javascript,php,ternary-operator,Javascript,Php,Ternary Operator,首先,这个表达式有名字吗 Javascript var value = false || 0 || '' || !1 || 'string' || 'wont get this far'; value等于string(string)也就是第五个选项 PHP $value等于true(bool) 我认为通过嵌套三元运算符实现与JavaScript相同的结果的正确方法是正确的吗?最好的解决方案是什么 此测试false | | | | | | | | | | | | | | | | | | |!1

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

Javascript

var value = false || 0 || '' || !1 || 'string' || 'wont get this far';
value
等于
string
(string)也就是第五个选项

PHP

$value
等于
true
(bool)


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

此测试
false | | | | | | | | | | | | | | | | | | |!1 | | true | |“不会走这么远”
将返回一个布尔值。如果任何值为
true
,它将返回
true
,这就是
的工作方式。它不是将第一个有效值应用于接收变量的三元表达式

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

您可以这样做,使表达式在PHP变量中返回布尔值而不是整数:

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

返回值将是
true

PHP中的等效运算符是
?:
,它是不带中间部分的:

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

$a?:$b
$a的缩写吗$a:$b

如果您使用的是PHP5.3或更高版本,请参阅

另一方面,可以使用嵌套的正则三元运算符

$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

它仅为
true
测试
echo true你可能想看看。在JS中,它们被称为短路评估
@BlazeSahlzen感谢知道正确的术语帮助很大。我认为问题不是关于三元运算符。但是OP混淆地调用了三元运算符而不是短路求值。在Javascript中,OP返回一个操作数,而不是布尔值。在PHP中实现这一点的等效方法是
?:
。问题回答了。谢谢你的解释。我在假设其他的东西。OP没有感到困惑,OP只是建议使用三元来实现结果。刚刚意识到。。并删除了我的答案以支持此答案。“
。| |·······································?
|
是否返回布尔值?它确实返回布尔值,但不是直接返回变量,在PHP中为否。我没有得到两张反对票,但好吗?它要么返回布尔值,要么不返回布尔值。将返回值赋给变量与否没有区别。一个值就是一个值。通过强制转换,
|
的布尔返回值不会得到更多的布尔值。
$value=current(array_filter(array(false,0,…)))
–我希望没有人需要使用它,但它在这里。。。
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