Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找文件夹中的所有文件,并按文件名的一部分进行分组_Php_Foreach_Scandir - Fatal编程技术网

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

Php 查找文件夹中的所有文件,并按文件名的一部分进行分组,php,foreach,scandir,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(

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

  • 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>";
}
?>

跟踪您发现的内容,只有在处理完所有内容后才执行输出部分:

$data = array();
foreach(...) {
    $text = function_to_extract_relevant_filename_portion();
    $data[$text] = true;
}
$file_name_parts = array_keys($data);
... output filename parts here ...
您可以将这两个循环组合起来,如果您以前已经输出了特定的名称,则可以不输出任何内容。

这里有一个单行程序:

$files = array_values(array_filter(array_unique(array_map(function($a){ if(!in_array($a, array('.','..'))){ $a = explode('-', $a); return "<option value='".$a[0]."'>".$a[0]."</option>"; }}, $files))));
在开始循环之前,我找不到过滤结果的方法

scandir
返回一个数组,其中包含给定目录中的所有文件名和目录名

您希望筛选与已更改名称重复的数组(删除条目)

到目前为止,您知道如何更改名称:

$name = strtok($file, '-');
您还有一个附加的过滤条件,即您不希望点条目包含单点和双点

($file != "." && $file != "..")
最后,您需要过滤重复项

所以,让我们把这些放在一起。首先,您必须获得目录列表:

$path = '../resources/banner/';

$files = scandir($path);
要过滤阵列,您可以使用:

应用此过滤器后,点条目已被删除。下一步是规范化名称。这可以通过以下方式实现:

应用此映射后,所有文件的名称都已创建

现在需要删除重复的条目。这可以通过以下方式实现:

按照您希望的方式处理阵列后,您只需输出它:

foreach ($files as $file) {
    printf("<option value='%1\$s'>%1\$s</option>", htmlspecialchars($file));
}
foreach($files as$file){
printf(“%1\$s”,htmlspecialchars($file));
}
把这些放在一起():


我真的很感谢你花了这么多时间。这对我来说很有意义,而且很有效。非常感谢你。
$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>", htmlspecialchars($file));
}
<?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));
}