Foreach glob循环不会遍历PHP中的所有文件

时间:2017-04-17 03:59:58

标签: php database foreach

我目前正在设置一个搜索引擎,并且在使用此循环时遇到了一些奇怪的事情,并且它看起来没有通过所有20万个文件。

我可以在服务器上看到该文件,但是当我搜索它时,它并没有显示出来。其他搜索,它的工作正常。

它搜索的文件夹有另一层文件夹,所有文件只存储在最后一层文件夹中。所以我这样搜索:

glob('database/*/*/*.txt')

这是我的代码:

if (isset($_GET['q'])){
    $search = $_GET['q'];
}else{die;}

$files = array();

foreach (glob('database/*/*/*.txt', GLOB_NOCHECK) as $path) {
    $title = basename($path, ".txt").PHP_EOL;
    if(strripos($title,$search) != false){
        array_push( $files, $path );
        echo $title . '<br>';
        echo $path . '<br>';
    }
}

错误日志显示任何内容,访问日志提供200响应。

是否可以通过其他方式搜索文件夹中的文件?还是我没见到的东西?

1 个答案:

答案 0 :(得分:1)

根据我的理解 - 所有标题都被提取到foreach循环中,但它们不包含在array $files中。因此,深入研究if语句是有意义的:

if(strripos($title,$search) != false){

来自php.net的手册说明:

  

警告此函数可能返回布尔值FALSE,但也可能返回a   非布尔值,其值为FALSE。请阅读有关的部分   布尔值获取更多信息。使用===运算符进行测试   返回此函数的值。

因为您应该使用===来检查相等的状态,所以您应该使用!==(而不是!=)来表示不相等。因此,我要测试的第一件事是:

if(strripos($title,$search) !== false){

如果问题仍然存在,我会尝试从该行中删除PHP_EOL

 $title = basename($path, ".txt").PHP_EOL;

并改为喜欢这样:

 $title = basename($path, ".txt");

我不确定你为什么在这里使用PHP_EOL,但我不认为这是必要的? (不确定 - 有人 - 告诉我,如果我错了)。

所以剩下的代码就是:

foreach (glob('database/*/*/*.txt', GLOB_NOCHECK) as $path) {
    $title = basename($path, ".txt");
    if(strripos($title,$search) !== false){
        array_push( $files, $path );
        echo $title . '<br>';
        echo $path . '<br>';
    }
}