我的值为$field
$field
是一个5位数字,我有一个图像集中包含图像的文件夹。因此,对于每个数字, “12345”,如果存在多个图像,可能会有“12345_1”或“12345_2”等。
我使用以下内容检查每个文件是否存在,然后为存在的文件构建逗号分隔值以插入CSV文件。
例如,如果A存在且B存在,则返回“A,B”
我知道自己要实现的目标,并拥有以下内容......
if (file_exists('images/' . $field . '.JPG')) {
$file1 = 'images/' . $field . '.JPG';
}
if (file_exists('images/' . $field . '_1.JPG')) {
$file2 = 'images/' . $field . '_1.JPG';
}
if (file_exists('images/' . $field . '_2.JPG')) {
$file3 = 'images/' . $field . '_2.JPG';
}
if((isset($file1)) && (!isset($file2)) && (!isset($file3))) {
return "$file1";
} elseif((isset($file1)) && (isset($file2)) && (!isset($file3))) {
return "$file1,$file2";
} elseif((isset($file1)) && (isset($file2)) && (isset($file3))) {
return "$file1,$file2,$file3";
}
但这似乎是写我正在尝试做的事情的一种非常废话的方式,特别是在真实示例中,我正在为多达10个文件执行此操作,因此这非常庞大。
有没有更好的方法来做到这一点,或者我错过的方法可以让生活更轻松? (我还在学习!)
答案 0 :(得分:2)
修改强>
旧代码可能没有按预期工作。前置./
到images
以查找正确的文件。现在还使用字符范围进行不区分大小写的文件扩展名搜索。
为什么不glob?它根据您传递的模式查找文件,并返回包含匹配文件的数组。
$files = glob ('./images/' . $field . '*.[jJ][pP][gG]');
if (is_array($files) && count($files)) {
// if you need to remove the `./` from the front of the file name,
// use the following line
$files = array_map(function($val) { return substr($val, 2); }, $files);
return implode(',', $files);
}
它可以使用通配符搜索目录。请参阅文档页面上的第一条注释,了解其工作原理。基本上,*
是一个匹配任何字符的通配符。
答案 1 :(得分:0)
尝试这样的事情。
首先在这里创建一个可能的文件结尾列表(这里来自_0.jpg up to
_ 100.jpg ). The first one is the original without
_ X.jpg`。
然后你循环遍历所有并收集现有文件,最后将它们内爆以获得逗号分类列表。
$extensions = [".jpg",];
for ($i = 0; $i <= 100; $i++){
$extensions[] = sprintf("_%d.jpg", $i);
}
$existing_files = [];
foreach ($extensions as $extension) {
$filename = "images/" . $file . $extension;
if(file_exists($filename)){
$existing_files[] = $filename;
}
}
$result = implode(",", $existing_files);
答案 2 :(得分:0)
可以通过像这样的几个循环完成所有这些
$field = '123456';
$max_loop = 10;
$files_to_check = [];
$result = '';
// generate filenames with _number added
// first the odd filename with no additional numeric
$files_to_check[] = "images/$field.jpg";
// loop all the others
for ( $x=1; $x <= max_loop; $x++) {
$files_to_check[] = sprintf('images/%s_%d.jpg', $field, $x);
}
foreach ( $files_to_check as $file ) {
if (file_exists($file) ) {
$result = $file . ',';
}
}
$result = trim($result, ',');
return $result;
答案 3 :(得分:0)
SPL(StandardPHPLibrary)也可以完成这项工作。我首先阅读目录,然后通过isFile()
方法检查它是否存在(如果它是一个文件),最后将匹配的文件名存储到数组中。
$iterator = new DirectoryIterator(__DIR__);
foreach ($iterator as $fileinfo) {
$isFile = $fileinfo->isFile();
$isMatch = stripos($fileinfo->getFilename(), $field) !== false;
if ($isFile && $isMatch) {
$myFile[] = $fileinfo->getFilename()
}
}
echo implode(",", $myFile);
答案 4 :(得分:0)
如果您没有打电话给功能,则不需要返回!分配一个变量更好
$format = array(".JPG","_1.JPG","_2.JPG");
$file = array();
foreach ($format as $value) {
if (file_exists('images/' . $field.$value)) {
$file[] = 'images/'. $field.$value;
}
}
$result = "";
$last = count($file)-1; //last index key
foreach ($file as $k=>$f) {
if(isset($f)){
($last == $k) ? $result.= $f : $result.= $f.",";
}
}
var_dump($result);