58

当前代码:

<?php

  // See the AND operator; How do I simplify/shorten this line?
  if( $some_variable !== 'uk' && $some_variable !== 'in' ) {

    // Do something

  }

?>

和:

<?php

  // See the OR operator; How do I simplify/shorten this line?
  if( $some_variable !== 'uk' || $some_variable !== 'in' ) {

    // Do something else

  }

?>

有没有更简单(即更短)的方法来编写这两个条件?

注意:是的,它们是不同的,我期望有不同的方法来缩短代码。

4

8 回答 8

128

对于您的第一个代码,您可以使用 @ShankarDamodaran 给出的答案的简短更改in_array()

if ( !in_array($some_variable, array('uk','in'), true ) ) {

甚至更短的[]符号自 php 5.4 起可用,正如@Forty 在评论中指出的那样

if ( !in_array($some_variable, ['uk','in'], true ) ) {

是相同的:

if ( $some_variable !== 'uk' && $some_variable !== 'in' ) {

...但更短。特别是如果您比较的不仅仅是“英国”和“英国”。我不使用附加变量(Shankar 使用 $os),而是在 if 语句中定义数组。有些人可能会觉得很脏,我觉得它又快又整洁:D

您的第二个代码的问题在于它可以很容易地与 TRUE 交换,因为:

if (true) {

等于

if ( $some_variable !== 'uk' || $some_variable !== 'in' ) {

你在问一个字符串的值是不是 A 还是不是 B。如果是 A,它肯定不是 B,如果是 B,它肯定不是 A。如果它是 C 或其他任何东西,它是也不是 A 也不是 B。所以这个陈述总是(这里不考虑薛定谔定律)返回 true。

于 2013-11-13T09:59:21.620 回答
18

你可以in_array()在 PHP 中使用。

$os = array("uk", "us"); // You can set multiple check conditions here
if (in_array("uk", $os)) //Founds a match !
{
    echo "Got you"; 
}
于 2013-11-13T09:25:26.883 回答
2

一个可能有意义的替代方案,特别是如果多次进行此测试并且您正在运行 PHP 7+ 并安装了Set该类是:

use Ds\Set;

$strings = new Set(['uk', 'in']);    
if (!$strings->contains($some_variable)) {

或者在任何版本的 PHP 上,您都可以使用关联数组来模拟集合:

$strings = ['uk' => 1, 'in' => 1];
if (!isset($strings[$some_variable])) {

创建集合有额外的开销,但是每个测试都变成了 O(1) 操作。当然,被比较的字符串列表越长,节省的就越多。

于 2020-04-03T11:51:24.920 回答
1

如果您打算在 if 语句中构建一个函数,我还建议使用 in_array。它干净了很多。

如果您尝试为变量赋值,您可以使用 if/else 简写:

$variable_to_fill = $some_variable !== 'uk' ? false : true;
于 2013-11-13T09:33:52.087 回答
1

您可能会发现反转您的逻辑并使用带有空 if 的 else 语句更具可读性。

if($some_variable === 'uk' || $another_variable === 'in'){}

else {
    // This occurs when neither of the above are true
}
于 2020-04-03T10:55:10.070 回答
1

您需要进行多值检查。尝试使用以下代码:

<?php
    $illstack=array(...............);
    $val=array('uk','bn','in');
    if(count(array_intersect($illstack,$val))===count($val)){ // all of $val is in $illstack}
?>
于 2016-05-10T08:29:23.833 回答
0

我喜欢Habchi在评论中使用的代码

if(!($some_variable === 'uk' || $another_variable === 'in')){//do}
于 2021-11-26T18:09:59.750 回答
-1

一些基本的正则表达式可以很好地解决问题$some_variable !== 'uk' && $some_variable !== 'in':

if(!preg_match('/^uk|in$/', $some_variable)) {
    // Do something
}
于 2018-09-20T21:35:31.930 回答