PHP - 在多个目录中搜索文件


PHP - search file in more than 1 directory

我想制作脚本来搜索多个目录中的一个文件,例如我有 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');