所有具有相同名称的文件到数组中(包括子目录)

时间:2013-08-22 12:08:18

标签: php

请考虑以下目录结构:

- 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

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

问题是某些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
}

2 个答案:

答案 0 :(得分:3)

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

$matchedFiles = glob("artists/$artist/*/album-art.jpg");

答案 1 :(得分:0)

如果大多数相册都包含album-art.jpg,并且您已有所有相册的路径。您可以随机播放相册,首先弹出,检查文件是否由file_exists或类似文件album-art.jpg。如果不是,则弹出相册数组中的下一个元素...

这应该更有效,因为如果文件存在,你可能只在少数checkinig中匹配。

虽然巴马尔方法更为直接。