PHP使用OR运算符检查值是否与多个值匹配

7

我有一个文件名($fname),需要给文件类型分配$pClass,并在后面添加“-”。目前无论文件类型是什么,我都会得到text-

//This gets the extention for the file and assigns the class to the icon <i>
$pieces = explode('.', $fname);
$ext = array_pop($pieces);

if($ext == (('txt')||('rtf')||('log')||('docx'))){
  $pClass = 'text-';
}
else if($ext == (('zip')||('sitx')||('7z')||('rar')||('gz'))){
  $pClass = 'archive-';
}
else if($ext == (('php')||('css')||('html')||('c')||('cs')||('java')||('js')||('xml')||('htm')||('asp'))){
  $pClass = 'code-';
}
else if($ext == (('png')||('bmp')||('dds')||('gif')||('jpg')||('psd')||('pspimage')||('tga')||('svg'))){
  $pClass = 'image-';
}
else {
  $pClass = '';
}

为什么我的带有OR运算符的if语句不起作用?

首先通过检查$ext被设置为什么值来进行调试。 - Chaim
我刚刚重新检查了一下,每个文件的$ext都被正确设置了(例如example.php返回“php”)。 - mcky
(('txt')||('rtf')||('log')||('docx'))将始终评估为1,然后才与$ext进行比较。 - Chaim
你的初始if语句将始终返回true,这就是为什么你总是得到test-的原因。 - mferly
解决方案不应该出现在问题中,我们需要的是答案。 - Rizier123
3个回答

22
逻辑或运算符 ||不像你期望的那样工作。逻辑或运算符||总是计算出一个布尔值,要么是TRUE(真),要么是FALSE(假)。因此,在你的例子中,你的字符串被转换成布尔值然后再进行比较。

如果语句:

if($ext == ('txt' || 'rtf'|| 'log' || 'docx'))

归根结底:

if($ext == (TRUE || TRUE || TRUE || TRUE))
if($ext == TRUE)

要解决这个问题并使代码按照您的意愿工作,您可以使用不同的方法。

多重比较

解决问题并检查您的值是否符合多个值的一种方法是,实际上将该值与多个值进行比较:

if($ext == "txt" || $ext == "rtf" /* || ... */)

in_array()

另一种方法是使用函数in_array()并检查值是否等于数组中的一个值:

if(in_array($ext, ["txt", "rtf" /* , ... */], TRUE))

注意:第二个参数用于严格比较

switch()

您还可以使用switch来检查您的值是否与多个值匹配,并允许一个 case 穿透到另一个 case。

switch($ext){

    case "txt":
    case "rtf":
 /* case ...: */
        $pClass = "text-";
    break;

}

请问我们有这个的好的副本吗?否则我们就在这里立即创建它。 - Rizier123
谢谢,我现在去尝试一下。 - mcky
非常好,感谢您展示正确的方法来完成它。 - mcky

2
我建议将其更改为以下内容:

我只是简单地将它更改为这样:

//This gets the extention for the file and assigns the class to the icon <i>
$pieces = explode('.', $fname);
$ext = array_pop($pieces);
if(in_array($ext,array('txt','rtf','log','docx'))){
    $pClass = 'text-';
}elseif(in_array($ext,array('zip','sitx','7z','rar','gz'))){
    $pClass = 'archive-';
}elseif(in_array($ext,array('php','css','html','c','cs','java','js','xml','htm','asp'))) {
    $pClass = 'code-';
}elseif(in_array($ext,array('png','bmp','dds','gif','jpg','psd','pspimage','tga','svg'))){
    $pClass = 'image-';
}else {
    $pClass = '';
}

1
您可以使用in_array()将一个值与多个字符串进行比较:
if(in_array($ext, array('txt','rtf','log','docx')){
    // Value is found.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接