检查字符串是否包含在任何列出的数组中

时间:2017-04-11 09:41:16

标签: php arrays string match

我正在执行一个php程序来返回给定路径中的文件和文件夹。我需要排除包含下面数组中列出的字符串的文件和文件夹。

$folderArray = array("folder1", "temp");
$fileArray = array("test", "testing", "copy");

例如:我想要排除带有单词temp的文件夹,带有单词copy的文件(例如:filename_copy.php)等。

当前代码:

$string = "filename-copy.php";   // this can be folder name/file name
foreach($folderArray as $a) {
    if (!stripos($string,$a) !== false) echo "yes";
    else echo "no";
}
foreach($fileArray as $a) {
    if (!stripos($string,$a) !== false) echo "yes";
    else echo "no";
}

但是在这里我需要在文件数组和文件夹数组中搜索单独循环中的字符串。还有其他简单的方法吗?

任何人都可以帮我这样做吗?提前谢谢。

4 个答案:

答案 0 :(得分:1)

在这里,我将这些数组APIS$folderArray$fileArray进行了冲突,而这些数组又作为此|的模式生成。因此,它会匹配folder1|tempfolder1中的任何字词     

temp

答案 1 :(得分:0)

您可以使用PHP in_array()函数进行完全匹配

<?php
   $folderArray = array("folder1", "temp");
   $fileArray = array("test", "testing", "copy");
   if (in_array("filename-copy.php", $folderArray)) {
     echo "yes";
   }
?>

对于部分匹配,您可以使用strpos()

function array_search_partial($arr, $keyword) {
    foreach($arr as $index => $string) {
        if (strpos($string, $keyword) !== FALSE)
            return $index;
    }
}

答案 2 :(得分:0)

您可以拥有一组变量名称并使用$$var_name变量变量(read more)。

<?php
$folderArray = array("folder1", "temp");
$fileArray = array("test", "testing", "copy");

$arrs = array('folderArray', 'fileArray');
$string = "filename-copy.php"; 

foreach ($arrs as $array_name) {
  foreach ($$array_name as $v) {
    if (!stripos($string, $v) !== false) {
      echo "yes";
    } else {
      echo "no";
    }
  }
}

演示:https://eval.in/772973

答案 3 :(得分:0)

您可以使用RecursiveDirectoryIteratorRecursiveIteratorIteratorRecursiveFilterIterator(或RecursiveCallbackFilterIterator)的组合。这样您只需检索所需的文件。

看看the answer to the similar question。特别是在这一部分:

$files = new CallbackFilterIterator(
    new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator(
            $path,
            FilesystemIterator::SKIP_DOTS
        ),
        RecursiveIteratorIterator::LEAVES_ONLY
    ),
    $filter
);

foreach ($files as $key => $file) {
    // Do something with files.
    var_dump($key, $file);
}

您可以提供所需的任何过滤功能。在你的情况下,它将是这样的:

$folderArray = ["folder1", "temp"];
$fileArray = ["test", "testing", "copy"];

$filter = function ($current, $key, $iterator) use ($path, $folderArray, $fileArray) {
    $path = preg_quote($path, '/');
    $folderArray = implode('|', array_map('preg_quote', $folderArray));
    $fileArray = implode('|', array_map('preg_quote', $fileArray));

    if (
        preg_match('/^' . $path . '\/(' . $folderArray . ')/', $key)
        || preg_match('/' . $fileArray .  '/', $current->getFilename())    
    ) {
        return false;
    }

    return true;
};