【问题标题】:PHP - search file in more than 1 directoryPHP - 在多个目录中搜索文件
【发布时间】:2016-02-26 15:32:28
【问题描述】:

我想编写脚本来搜索多个目录中的一个文件,例如我有目录的结构:

 -images
   --2014
   --2015
   --2016

现在我的 PHP 脚本应该在 2014/2015/2016 之一中搜索 FILE.jpg(文件夹将被动态创建,所以我不能将文件夹列表放入脚本中(始终只有文件夹“图像”)。

最好的问候!

【问题讨论】:

标签: php file search directory dir


【解决方案1】:

您只能使用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');

【讨论】:

  • 这可能是最好的主意,但如果我不知道它会有多少子文件夹?可以是 images/2014 或 images/2014/02 或 images/2014/02/02 等。
【解决方案2】:

你也可以使用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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2011-11-28
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多