我有一个包含图像的文件夹,如下所示:
- colorwaves-1.png
- colorwaves-2.png
- snow-1.png
- snow-2.png
我需要填充一个仅包含以下内容的下拉列表:
- 彩色波
- 雪
这是我的代码:
<?php
$files = scandir('../resources/banner/');
foreach ($files as $file)
if ($file != "." && $file != ".."){
$x = array_shift(explode('-', $file)); //remove everything after "-"
echo "<option value='".$x."'>".$x."</option>";
}
?>
这当然会给我 4 个结果,其中有两个重复项。 在开始循环之前我找不到过滤结果的方法。 如有任何帮助,我们将不胜感激。
最佳答案
I cant find a way to filter the results before I start the loop.
scandir
返回一个数组,其中包含给定目录中的所有文件和目录名称。
您想要过滤此数组(删除与已更改名称重复的条目)。
到目前为止您知道如何更改名称:
$name = strtok($file, '-');
您还有一个额外的过滤条件,即您不希望点条目包含单点和双点。
($file != "." && $file != "..")
最后您需要过滤重复项。
所以让我们把这一切整合在一起。首先,您必须获取目录列表:
$path = '../resources/banner/';
$files = scandir($path);
要过滤数组,您可以使用 array_filter
:
$files = array_filter($files, function($file) {
return ($file != "." && $file != "..");
});
应用此过滤器后,点条目已被删除。接下来是标准化名称。这可以通过 mapping a callback function 来完成:
$files = array_map(function($file) {
return strtok($file, '-');
}, $files);
应用此映射后,所有文件的名称都已创建。
现在您需要删除重复的条目。这可以通过 array_unique
来完成:
$files = array_unique($files);
按照你希望的方式处理数组后,你只需要输出它:
foreach ($files as $file) {
printf("<option value='%1\$s'>%1\$s</option>", htmlspecialchars($file));
}
将所有这些结合在一起(Demo):
<?php
/**
* @link http://stackoverflow.com/a/30092161/367456
*/
$path = '.';
$files = scandir($path);
$files = array_filter($files, function($file) {
return ($file != "." && $file != "..");
});
$files = array_map(function($file) {
return strtok($file, '-');
}, $files);
$files = array_unique($files);
foreach ($files as $file) {
printf("<option value='%1\$s'>%1\$s</option>\n", htmlspecialchars($file));
}
我希望这对您有所帮助并演示了一些编程技巧:
将程序逻辑分为三个主要部分:输入、处理和输出。
处理数据时,将其分成多个小步骤,以便每个步骤都做事、做对。然后,您可以逐步构建您的程序,如果它仍然有效,请随时尝试。
PHP 有许多数组函数。如果您使用数组,请使用它们。 PHP 手册讨论了它们中的每一个,我展示了三个基本的:array_filter、array_map 和 array_unique。
回调函数允许您使用自己的代码扩展 PHP 核心功能(或:其他人的代码)。没有必要全部从头开始编写。寻找可重用的功能。
当您输出 HTML 时,您必须正确编码数据(此处:作为 HTML)。由于您无法控制目录列表中的名称,因此可能会注入(inject) HTML。 始终在输出时对数据进行正确编码。
关于php - 查找文件夹中的所有文件并按文件名的一部分进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30083131/