对于通过if语句运行的所有文件,PHP返回true

时间:2016-08-19 11:35:35

标签: php if-statement boolean substr

我完全难过了。我有一个数组,其中包含我网站上目录中的所有文件。我在if循环中使用foreach语句来过滤结果。如果文件名以三个字母("wwa" or "wea" or "swa" or "hta" or "cta" or "twa" or "fra")的特定组合开头,则该文件名将分配给$alert_string

由于某种原因,所有文件都在if语句中返回true,因此每次都会简单地覆盖该变量,并为扫描的最后一个文件分配变量。

代码:

   $alert_files = scandir("/home/prww/public_html/blog/");

   foreach ($alert_files as $values) {
        if ((substr($values, 0, 3)) == ("wwa" or "wea" or "swa" or "hta" or "cta" or "twa" or "fra")) {
            $alert_string = $values;
        }
    }

目录中的文件:

Files in the directory

显然,只有以" hta"开头的文件应该在if语句中返回true。那么为什么每个文件都返回true并且如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

("wwa" or "wea" or "swa" or "hta" or "cta" or "twa" or "fra")

产生一个布尔值TRUE。只要substr($values, 0, 3)返回某些内容,您的条件表达式将始终为TRUE。

您无法在不了解运营商实际工作方式的情况下编写看起来像英语有意义的代码。当所有其他方法都失败时,echo中间结果,这样您就可以了解您的计划正在做什么。

答案 1 :(得分:1)

你的if语法是错误的。 您可以使用数组简化逻辑:

//array of allowed substrings, used as index for quicker lookup
$substringKeys = array_flip(["wwa","wea","swa","hta","cta","twa","fra"]);

$alert_string='';

$alert_files = scandir("/home/prww/public_html/blog/");

foreach ($alert_files as $filename) {
    $substr = substr($filename, 0, 3);
    if (isset($substringkeys[$substr])) {
        //add to, not overwrite, $alert_string
        $alert_string .= $values;
    }
}

答案 2 :(得分:0)

您可以使用函数在array_map

的帮助下实现此功能
$alert_files = scandir("/home/prww/public_html/blog/");

$fileNames = array_filter(array_map("checkName",$alert_files));
print_r($fileNames);

function checkName($fileName)
{
    $file = substr($fileName,0,3);
    $conditionArray = array("wwa","wea","swa","hta","cta","twa","fra");
    if(in_array($file,$conditionArray))
    {
        return $fileName;
    }
}