php - 查找文件夹中的所有文件并按文件名的一部分进行分组

标签 php foreach scandir

我有一个包含图像的文件夹,如下所示:

  • 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/

相关文章:

javascript - fadeOut 函数使整个页面内容消失

php - "Show"jQuery 中的 PHP 数组

c++ - 使用 for_each 的特征矩阵 vector 乘法

php - 使用 PHP 扫描目录并在 JavaScript 中使用结果

python - os.walk 对于递归访问文件夹非常慢

php - 展开文件名以分隔名称和扩展名在 PHP 中不起作用?

php - PHP中的通知系统

php - PHP-MySQL错误1040 “Too many connections”

javascript - 为数组中的对象分配优先级值

c# - 为什么在通过 IEnumerable<T> 更改 foreach 类型时没有出现编译器错误?