在开始循环之前我找不到过滤结果的方法。
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)。由于您无法控制目录列表中的名称,因此可能会注入 HTML。 始终在输出时正确编码您的数据。