我有一个值是$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个文件这样做,所以这是相当庞大的。
是否有更好的方法来做到这一点,或者我错过了一个可以使生活更轻松的方法?(我还在学习!)
EDIT
旧代码可能没有像预期的那样工作。将./
添加到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);
}
它可以使用通配符搜索目录。有关其工作原理的解释,请参阅文档页面上的第一条注释。基本上,*
是一个通配符,表示匹配任何字符。
这一切都可以很简单地完成,像这样的几个循环
$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;
SPL (standardphlibrary)也可以完成这项工作。我首先读取目录,然后通过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);
阅读更多:DirectoryIterator
PHP手册页
试试这样做。首先,在这里你创建一个可能的文件结尾列表(这里是从_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);
如果不是调用函数,则不需要返回!分配一个变量比较好
$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);