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

时间:2016-06-27 13:11:01

标签: php

我的值为$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个文件执行此操作,因此这非常庞大。

有没有更好的方法来做到这一点,或者我错过的方法可以让生活更轻松? (我还在学习!)

5 个答案:

答案 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);

了解详情:DirectoryIterator PHP manual page

答案 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);