是否有编写下面代码的简写方法?
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_flip比array_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个元素.
除非我弄错了,否则就没有本土的做法.如果这是您必须经常检查的内容,请尝试使用自定义函数,例如:
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)
我的第一个想法将进入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"})时,你可能会考虑这个解决方案.我给了它第二个想法,必须说不要使用它.想象一下,您的同事如何爱您搜索该方法引入的错误.