在父亲foreach循环内的strripos阵列针

时间:2013-10-13 07:07:20

标签: php arrays loops foreach strpos

我在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是否已定义为“是”。就像我说的,它适用于第一个例子,但我不能让数组工作。重申一下,我已经在$file的{​​{1}}循环中。

更新

尝试使用scandir(),但我可能做错了。我试过了:

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)));

不行。

3 个答案:

答案 0 :(得分: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循环。这样你最终会得到'是'或'不'。

答案 1 :(得分: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;
}

this回复的修改版本)


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

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()提取{{1}}中提到的扩展名。 {3}}发帖。

答案 2 :(得分:0)

尝试以下方法:

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

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

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

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