我目前正在设置一个搜索引擎,并且在使用此循环时遇到了一些奇怪的事情,并且它看起来没有通过所有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响应。
是否可以通过其他方式搜索文件夹中的文件?还是我没见到的东西?
答案 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>';
}
}