我想制作脚本来搜索多个目录中的一个文件,例如我有 dir 的结构:
-images
--2014
--2015
--2016
现在我的 PHP 脚本应该在 2014/2015/2016 之一中搜索 FILE.jpg(文件夹将动态创建,所以我不能在脚本中放置文件夹列表(只是文件夹"图像"将始终)。
此致敬意!
您只能使用 glob()
.
在你描述的确切情况下,它应该看起来像这样:
$files = glob('path_to_images/*/FILE.jpg');
更一般地说,根据需要在已知文件夹路径和搜索的文件名之间放置尽可能多的/*
,以探索给定的深度级别。
编辑,根据OP的评论扩展解决方案
如果你对树结构一无所知,你可以做一个深入的多级搜索,像这样:
function doGlob($target, $context) {
if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) {
foreach ($dirs as $dir) {
$result = array_merge($result, doGlob($target, $dir));
}
}
return $result;
}
$files = doGlob('FILE.jpg', 'path_to_images');
它将返回给定$context
中任何位置$target
文件的所有匹配项。
注意:如果context
是一个大结构,可能会很耗时!
因此,您可以限制搜索深度,如下所示:
function doGlob($target, $context, $max_depth = -1, $depth = 0) {
$result = glob($context . '/' . $target);
if ($depth > $max_depth) {
return $result;
}
if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) {
foreach ($dirs as $dir) {
$result = array_merge($result, doGlob($target, $dir, $max_depth, $depth + 1));
}
}
return $result;
}
$files = doGlob('FILE.jpg', 'path_to_images', <max-depth>);
另一方面,如果您计划仅检索唯一文件,则在找到该文件后立即停止:
function doGlob($target, $context) {
if ($result) {
return $result;
}
if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) {
foreach ($dirs as $dir) {
$result = array_merge($result, doGlob($target, $dir));
}
}
return $result;
}
$files = doGlob('FILE.jpg', 'path_to_images');
您也可以使用 scandir :
function search($d)
{
$dir=scandir($d);
echo '<ul>';
foreach ($dir as $key => $value)
{
if($value!='.' && $value!='..')
{
if(is_dir($d.'/'.$value))
{
echo "<li>".$value."</li>";
search($d.'/'.$value);
}
else
echo "<li>".$value."</li>";
}
}
echo '</ul>';
}
search('images');
在此示例中,我显示所有文件,但您可以添加一个条件:
function search($d, $search)
{
$dir=scandir($d);
echo '<ul>';
foreach ($dir as $key => $value)
{
if($value!='.' && $value!='..')
{
if(is_dir($d.'/'.$value))
{
echo "<li>".$value."</li>";
search($d.'/'.$value, $search);
}
else
{
echo "<li>".$value."</li>";
if($value==$search)
echo "found";
}
}
}
echo '</ul>';
}
search('images', 'your_file');