PHP: цикл while - использование измененной переменной в условии - PullRequest
1 голос
/ 31 декабря 2011

У меня есть проблема с циклом while в PHP, которая, кажется, могла бы быть решена с помощью знака амперсанда, чтобы сделать его ссылкой, если бы он был где-то еще. Ниже приведен пример. Я пытаюсь добавить _n к имени файла (в базовом имени). Если есть _1, то я хочу, чтобы он был _2, если есть _2, я хочу, чтобы он был _3 и так далее. По какой-то причине я не могу обновить переменную $ filename в условии, поэтому я думаю, что она не изменяется в цикле.

$dir = 'images';
$filename = '123.jpg';
$i = 0;
while (file_exists($dir.'/'.$filename)) {
    $filename = preg_replace('/^(\d*?)(\.jpg)$/',"$1_".(++$i)."$2",$filename);
}
echo $filename;

Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 31 декабря 2011

Похоже, ваше регулярное выражение немного отключено, и вы не захватываете _n, если оно уже существует.

while (file_exists($dir.'/'.$filename)) {
  $filename = preg_replace('/^(\d+)(.*)(\.jpg)$/',"$1_".(++$i)."$3",$filename);
  //-------------------------------^^^^ Capture the _n if it exists
  // And stick the number in with $1 and $3 (now the .jog)
}
echo $filename;

// Current files...
123_1.jpg
123_2.jpg
123.jpg

// Outputs 123_3.jpg
1 голос
/ 31 декабря 2011

Если вы не хотите использовать регулярное выражение и хотите убедиться, что у вас есть все jpg-файлы в каталоге, вы можете использовать glob() и некоторые базовые функции для работы со строками, например:

$dir = 'images/';
foreach (glob($dir.'*.jpg') as $file) {
  $ext = strpos($file, '.jpg'); // get index of the extension in string
  $num = (int) substr($file, 0, $ext); // get the numeric part
  $file = $num+1 . '.jpg'; // rebuild the file name
  echo $file, PHP_EOL;
}
0 голосов
/ 31 декабря 2011

Вот пример использования функции без регулярных выражений. Этот способ работает в гораздо более широком диапазоне обстоятельств.

т.е. любое расширение файла работает, а подчеркивание или период допускаются в базовом имени

Если вам не нужны эти вещи, тогда использование preg_replace () более понятно, см. Ответ Майкла.

<?php

function nextUnusedFileName($path, $fileName){
    $index = 1;
    while (file_exists($path."/".$fileName)) 
    {
        $baseNameEndIndex = strrpos($fileName, '_'); 
        $extensionStartIndex = strrpos($fileName, '.');
        if($baseNameEndIndex <= 0){
            $baseNameEndIndex = $extensionStartIndex;
        }
        $baseName = substr($fileName, 0, $baseNameEndIndex)."_".$index; 
        $extension = substr($fileName, $extensionStartIndex+1, strlen($fileName)-$extensionStartIndex);
        $fileName = $baseName.".".$extension;
        $index++ ;
    }
    return $fileName;
}//end nextUnusedFileName


//main

$dir = "images";
$filename = "123.jpg";

$filename = nextUnusedFileName($dir, $filename);

echo $filename;
?>
...