使用PHP扫描图像目录,并为重复的文件名匹配增加计数器

时间:2014-05-05 22:12:41

标签: php spl

我有一个上传文件夹,其中包含以此格式命名的图片...

10000XXXX-COUNT-DATE-EMPLOYEE-PP-FILEEXTENSION

看起来像这样......

100002246-1-2014-05-05-David.Rosales-PP.jpg

每次使用PHP上传照片时,我都需要扫描此目录中的文件,并找到ID部分的匹配项,即文件名的前9位数字。

如果找到匹配项,我需要在左侧第11个字符位置的COUNT位置附加一个数字。

这个想法是一个ID可以有5-6个图像。如果ID已经有1个图像,那么下一个图像应该被命名为100002246-2-2014-05-05-David.Rosales-PP.jpg,之后不同上传会话中的另一个图像将是100002246-3-2014-05-05-David.Rosales-PP.jpg,因此ID号的每个新图像将增加1个数字。你可以看到我在第11个字符位置添加了计数。

我不确定如何最好地实现这一目标。我无法使用数据库,因此我必须在上传过程中执行此操作并扫描目录以查找图像的任何匹配项。

我有什么想法和例子可以做到最好吗?

扫描目录这样的东西看起来很有希望......

foreach (new DirectoryIterator('.') as $item) {
    echo $item, PHP_EOL;
}

更新 - 我到目前为止尝试解决方案

<?php
$orderId = $_GET['orderid'];


$dir = new DirectoryIterator('uploads');
$fileMatches = array();

foreach ($dir as $fileinfo) {

    $filenameId= substr($fileinfo->getFilename(), 0, 9);

    if($filenameId === $orderId){
        //store File ID matches in an array
        $fileMatches[] = $filenameId;
    }
    echo $fileinfo->getFilename() . "<br>";
}
$totalImages = count($fileMatches);
echo '<hr>Total Images found for this ID '.$orderId.' = '.$totalImages;
echo '<hr>New count for image would be = '. ($totalImages+1);

?>

2 个答案:

答案 0 :(得分:2)

您可以将glob()用于您的目的。假设所有图片都在名为imgs的目录中:

$user_imgs = count(glob('imgs/*'.$user_id.'*')));

$user_imgs将包含imgs中文件名中包含$user_id的文件数。

如果需要,您可以使用该模式获得更多创意。此示例只查找文件名中任何位置$user_id的所有文件。由您决定您要搜索的模式的具体程度。

根据您尝试的解决方案进行更新

您可以将算法简化为:

$orderId = $_GET['orderid'];

$all_images = glob('uploads/'.$orderId.'*');

foreach($all_images as $i)
    echo $i . '<br/>';

$totalImages = count($all_images);

echo '<hr>Total Images found for this ID '.$orderId.' = '.$totalImages;
echo '<hr>New count for image would be = '. ($totalImages+1);

考虑新要求的更新

$orderId = $_GET['orderid'];

$all_images = glob('uploads/'.$orderId.'*');

$pp = $qc = 0;

foreach($all_images as $i) {
    if (strpos($i, '-PP.')!==false)
        $pp++;
    elseif (strpos($i, '-QC.')!==false)
        $qc++;
}

echo '<hr>Total Images found for this ID '.$orderId.' (PP) = '.$pp;
echo '<hr>New count for image would be = '. ($pp+1);

echo '<hr>Total Images found for this ID '.$orderId.' (QC) = '.$qc;
echo '<hr>New count for image would be = '. ($qc+1);

答案 1 :(得分:1)

要将字符串拆分为逻辑片段,您可以拆分,然后在操作它之后再加入它。这是我刚刚在我的机器上测试的东西,它可以工作。

<?php 
// note explicitly set here, but in wild it might be int
$_GET['orderid'] = '100002246';

if(! isset($_GET['orderid']) || ( isset($_GET['orderid']) && !is_string($_GET['orderid'])) 
  || (isset($_GET['orderid']) && is_string($_GET['orderid']) && !preg_match('/^[0-9]+$/', $_GET['orderid']))) {
    // don't run script, this isn't a valid ID
    die("We didn't have a good name\n");
  }

foreach (new DirectoryIterator('.') as $fileInfo) 
{
    if($fileInfo->isDot()) continue;

    $parts = preg_split('/-/', $fileInfo->getFilename());

    if(count($parts) != 7) 
    {
        echo "Cannot parse this file: ", $fileInfo->getFilename(), PHP_EOL;
        continue;
    }

    $associated_parts = array(
        "id"    => (int)$parts[0],
        "count" => (int)$parts[1],
        "date"  => $parts[2] . '-' . $parts[3] . '-' . $parts[4],
        "name"  => $parts[5],
        "ext"   => $parts[6]
    );

    if($associated_parts['id'] == $id) 
    {
        $associated_parts['count'] = $associated_parts['count'] + 1;
        $new_file = implode('-', $associated_parts);
        rename($fileInfo->getFilename(), $new_file);        
    }
}

foreach (new DirectoryIterator('.') as $fileInfo) 
{
    if($fileInfo->isDot()) continue;
    echo $fileInfo->getFileName(), PHP_EOL;
}