Php 将同名的所有文件放入数组(包括子目录) 请考虑以下目录结构: - artists - Ben-Major - Album 1 - Song-1.mp3 - album-art.jpg - Album 2 - Song-1.mp3 - album-art.jpg

Php 将同名的所有文件放入数组(包括子目录) 请考虑以下目录结构: - artists - Ben-Major - Album 1 - Song-1.mp3 - album-art.jpg - Album 2 - Song-1.mp3 - album-art.jpg,php,Php,如您所见,Ben Major艺术家的目录包含两个子目录(Album 1和Album 2),其中依次包含一个MP3文件和一个JPG文件。MP3文件的名称与此无关,但JPG文件的名称(无论它出现在哪个子目录中)将始终命名为album art.JPG 对于给定的艺术家,如何使用PHP中最有效的方法拉入一个随机的album art.jpg文件 问题是某些艺术家目录可能根本不包含名为album art.jpg的文件。我首先想到使用readdir(),然后在子目录中循环并使用glob()查找文件。然而,我认

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

对于给定的艺术家,如何使用PHP中最有效的方法拉入一个随机的
album art.jpg
文件

问题是某些艺术家目录可能根本不包含名为
album art.jpg
的文件。我首先想到使用
readdir()
,然后在子目录中循环并使用
glob()
查找文件。然而,我认为当我们有几张专辑时,这将是最低效的(可能某些艺术家会有10多张专辑)

有没有办法以递归方式使用
glob()
?以下是我试图实现的psuedo代码:

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
}
使用
glob()
时,可以将通配符放在目录中:

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

如果大多数相册将包含
album art.jpg
,并且您已经拥有指向所有相册的路径。你可能会洗牌相册,首先弹出,检查它是否有文件
album art.jpg
by file\u exists或类似文件。如果不是,则弹出相册数组中的下一个元素

这应该更有效,因为若文件存在,您可能只需要很少的检查就可以获得匹配


虽然Barmar方法更直接。

您能使用
glob(“*/album art.jpg”)
获取所有可用的文件吗?虽然这是一种查找所有文件的方法,但问题不仅在于这样做,还在于为每个艺术家随机获取专辑封面。这一部分和您的问题一样,只需选择数组中的一个随机元素。我不同意,因为OP想对它们进行分组。然而,这可以通过在PHP代码中循环使用
$artist
来实现。但是,您需要首先绘制他们的列表-所以,无论如何,上面的代码不足以解决问题。我在问题中没有看到任何关于分组的内容。该函数将艺术家名称作为参数,并返回一个随机选择的文件作为结果。谢谢@Barmar。这似乎是最有效的解决方案。处理匹配的文件没有问题,我可以找出这一部分;)