什么是检查多个变量ALL在IF语句中是否等于相同值的简写方法?(PHP)

Try*_*der 15 php if-statement

是否有编写下面代码的简写方法?

if (($tstat=='no_prices')&&($l1stat=='no_prices')&&($l2stat=='no_prices')&&($l3stat=='no_prices'))
{                                   
    //do something
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用下面的代码,但是当其中一个变量不等于'no_prices'时它就做了一些事情.

if (($tstat && $l1stat && $l2stat && $l3stat)=='no_prices')
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

为了检查字符串是否没有引起问题,我尝试将0替换为"no_prices",将1替换为其他值,但结果是相同的.

pri*_*imo 19

array_fliparray_unique以下快几倍:

function all_equal($arr, $value) {
  return array_keys(array_flip($arr)) == array($value);
}

$arr = array($tstat, $l1stat, $l2stat, $l3stat);

echo all_equal($arr, 'no_prices');
Run Code Online (Sandbox Code Playgroud)

到目前为止给出的答案的快速配置文件,对阵列长度1000进行1000次迭代:

  array_flip: 0.07321620 seconds
array_unique: 0.32569408 seconds
     foreach: 0.15136194 seconds
array_filter: 0.41404295 seconds
Run Code Online (Sandbox Code Playgroud)

用于配置文件的代码在这里:http://codepad.org/szgNfWHe

注意:由于@cypherabe 正确地指出,array_flip不超过array_unique直到所述阵列具有至少5个元素,并且不超过foreach直到所述阵列具有至少10个元素.


Flo*_*osi 8

除非我弄错了,否则就没有本土的做法.如果这是您必须经常检查的内容,请尝试使用自定义函数,例如:

function allEquals($chkstr, $vals) {
    if (!is_array($vals)) { die('allEquals() $vals not an array'); }
    foreach ($vals AS $v) {
        if ($chkstr != $v) { return false; }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*sch 7

我的第一个想法将进入PHP的Array API:

// $tstadt, $l1stat, … are all "no_prices"
$isAllNoPrice = array_unique(array($tstat, $l1stat, …)) == array("no_prices"));
if ($isAllNoPrice) {
    // …

}
Run Code Online (Sandbox Code Playgroud)

文档是强制性的,否则任何人(包括您自己)都不会理解代码.

如果效率可能是一个问题,其他人指出,array_unique()似乎是缓慢的.使用哈希表的键将是下一个方法:

// $tstadt, $l1stat, … are all "no_prices"
$varsMap = array(
    $tstat  => null,
    $l1stat => null,
    // …
);
if (array_keys($varsMap) == array("no_prices")) {
    // …

}
Run Code Online (Sandbox Code Playgroud)

但现在代码墙正在增长.PHP提供了一个几乎可以满足你想要的并且可以链接的运算符:&

$v1 = "no_prices";
$v2 = "no_prices";
$v3 = "no_prices";

var_dump(($v1 & $v2 & $v3) == "no_prices"); // bool(true)

$v3 = "prices";
var_dump(($v1 & $v2 & $v3) == "no_prices"); // bool(false)
Run Code Online (Sandbox Code Playgroud)

我说它几乎可以做你想要的:在某些情况下,你会有误报:

$v1 = 1;
$v2 = 1;
$v3 = 3;

var_dump(($v1 & $v2 & $v3) == 1); // bool(true)
Run Code Online (Sandbox Code Playgroud)

对于字符串,它似乎将位掩码切割为最短的字符串:

$v1 = "abcd";
$v2 = "ab";
$v3 = "abc";

var_dump($v1 & $v2 & $v3); // "ab"
var_dump(($v1 & $v2 & $v3) == "ab"); // bool(true)
Run Code Online (Sandbox Code Playgroud)

所以我不建议将其作为通用解决方案. 只有当你知道(=单元测试)你的值在一个集合中,没有组合永远不会导致误报(例如{"dog","cat","horse"})时,你可能会考虑这个解决方案.我给了它第二个想法,必须说不要使用它.想象一下,您的同事如何爱您搜索该方法引入的错误.