0

我在一个 scandir() 的 foreach 循环中,其中目录文件是$files as $file. 我试图通过使用针数组来简化我的 strripos 文件类型排除,而不是为每个文件类型传递几个 strripos 行。

这有效:

if ($code !== 'yes'){
    $excluded = strripos($file, '.js')
                || strripos($file, '.pl')
                || strripos($file, '.py')
                || strripos($file, '.py')
                || strripos($file, '.rb')
                || strripos($file, '.css')
                || strripos($file, '.php')
                || etc.;
    } else {
        $excluded = '';
    } 

但这不会:

    if ($code !== 'yes'){
        $exclusions = array('.js, .pl, .py, .rb, .css, .php, etc.');
        foreach($exclusions as $exclude){
            $excluded = strripos($file, $exclude);   
        } 
    } else {
        $excluded = '';
    } 

$code是用户定义为“是”或其他任何内容 = 否的简码属性。

然后,当我到达输出时,我检查是否$excluded已定义为“是”。就像我说的,它适用于第一个示例,但我无法让数组工作。重申一下,我已经$filescandir().

更新

尝试使用in_array,但我可能做错了什么。我试过了:

$exclusions = array('.js', '.pl', '.py', '.rb', '.css', '.php', '.htm', '.cgi', '.asp', '.cfm', '.cpp', '.dat', '.yml', '.shtm', '.java', '.class');
$excluded = strripos($file, (in_array($exclusions)));

我试过了:

$excluded = strripos($file, (in_array('.js', '.pl', '.py', '.rb', '.css', '.php', '.htm', '.cgi', '.asp', '.cfm', '.cpp', '.dat', '.yml', '.shtm', '.java', '.class')));

不去。

4

3 回答 3

3

您的数组当前只有一个元素,它是一个长字符串:

'.js, .pl, .py, .rb, .css, .php, etc.'

您应该像这样引用每个字符串元素:

$exclusions = array('.js', '.pl', '.py', '.rb', '.css', '.php', 'etc.');

尝试将您的代码更改为:

$excluded = 'no';

if ($code !== 'yes'){
    $exclusions = array('.js', '.pl', '.py', '.rb', '.css', '.php'); 
    foreach($exclusions as $exclude){
        $check = strripos($file, $exclude); 
        if ($check !== false) {
            $excluded = 'yes';
            break;
        }
    } 
} 

从分配开始$excluded = 'no';。只要strripos返回除false您分配之外$excluded = 'yes';的任何内容并跳出 foreach 循环。这样,您最终会得到“是”或“否”。

于 2013-10-13T07:21:18.703 回答
1

我假设您正在尝试检查特定目录中的任何文件是否在您的数组中有扩展名$exclusions,如果有,则排除该文件。

所以,如果这就是你想要的,那么你可以创建一个函数来将stripos接受数组作为针:

function striposa($haystack, $needle, $offset=0) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
        if(stripos($haystack, $query, $offset) !== false) {
            return true; // stop on first true result
        }
    }
    return false;
}

答案的修改版)


然后,在您的代码中,您可以像下面这样使用它:

if ($code !== 'yes') {
    $exclusions = array('.js', '.pl', '.py', ...);
    $flag = striposa($file, $exclusions);

    if ($flag) {
        // file contains one of the extensions
    } else {
        // no matching extensions found
    }
}

请注意,如果$file类似于hi.js.foo,这将失败,但为了确保不会发生这种情况,您可以使用本文pathinfo()中提到的提取扩展名。

于 2013-10-13T07:56:59.620 回答
0

尝试以下操作:

$extensions = array('js', 'pl', ...);

$extension = strtolower(array_pop(explode('.', $file)));
$excluded = in_array($extension, $extensions);

if (! $excluded) {
  // do something with file
}

您还可以使用pathinfo来提取扩展名。

于 2013-10-13T07:47:37.997 回答