在PHP中返回多个值,检查它们是否存在并已设置


Returning multiple values in PHP checking if they exist and are set

我有一个值是$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);