1

请考虑以下目录结构:

- artists
  - Ben-Major
    - Album 1
      - Song-1.mp3
      - album-art.jpg
    - Album 2
      - Song-1.mp3
      - album-art.jpg

如您所见,Ben-Major艺术家的目录包含两个子目录 (Album 1Album 2),其中依次包含一个 MP3 文件和一个 JPG 文件。MP3 文件的名称无关紧要,但 JPG 文件的名称,无论它出现在哪个子目录中,都将始终命名为album-art.jpg.

album-art.jpg对于给定的艺术家,如何使用 PHP 中最有效的方法提取随机文件?

问题是某些 Artist 目录可能根本不包含调用的文件album-art.jpg。我首先想到的是使用readdir(),然后遍历子目录并使用glob()来查找文件。但是,我认为当我们有几张专辑时,这几乎是低效的(某些艺术家可能会有 10 多张专辑)。

有没有办法以glob()递归方式使用?这是我要实现的伪代码:

function getRandomAlbumArt($artist)
{
    $matchedFiles = getFilesInSubDirs('album-art.jpg');
    // ^^ This would loop over the subdirectories in the most efficient manner, returning
    //    an array of all matched files, including their directory path.

    $index = rand(0, count($matchedFiles) - 1);
    return $matchedFiles[$index];
    // ^^ return 1 of the matches at random
}
4

2 回答 2

3

使用时,glob()您可以将通配符放在目录中:

$matchedFiles = glob("artists/$artist/*/album-art.jpg");
于 2013-08-22T12:17:43.687 回答
0

如果大多数专辑都包含album-art.jpg,并且您已经拥有所有专辑的路径。你可能会随机播放专辑,先弹出,检查它是否有album-art.jpgfile_exists 或类似的文件。如果不是,则弹出专辑数组中的下一个元素...

这应该更有效,因为如果文件存在,您可能只在少数检查中得到匹配。

尽管 Barmar 方法更为直接。

于 2013-08-22T12:18:02.613 回答