2014-07-11 65 views
0

我试图让PHP重新命名一个目录中的文件列表(1.jpg,2.jpg等)。每次大约20个文件。通常缺少一个数字(比如13.jpg,所以需要重新编号)。这就是我需要的脚本。下面是我有哪些作品,除了每次图像2-9.jpg被删除。所以如果文件夹中有19个文件,我运行脚本,然后是1.jpg和10-18.jpg。真奇怪?这是可以修复的吗?这可能与覆盖相同的文件名有关吗?这很奇怪,虽然后10.jpg它工作正常...PHP重命名按顺序删除某些文件

$i=1; 
foreach (array_filter(glob("../images/gallery/10/*") ,"is_file") as $f){ 
    rename($f, "../images/gallery/10/".$i.".jpg"); 
    $i++; 
} 

谢谢!

+0

这是因为在那里的循环将会有一个已经被用作文件名的偏移量,因此它将替换文件。 –

回答

0

谢谢你所有的答案!我能够解决它 - 这个问题与分拣有关。我发现PHP看到列表按照1.jpg,10.jpg,11.jpg等错误的方式排序。下面的代码修正了它 - 现在效果很好:

<?php 
function getFiles(){ 
    $files=array(); 
    if($dir=opendir("../images/gallery/10/")){ 
     while($file=readdir($dir)){ 
      if($file!='.' && $file!='..' && $file!=basename(__FILE__)){ 
       $files[]=$file; 
      } 
     } 
     closedir($dir); 
    } 
    natsort($files); //sort 
    return $files; 
} 
    $i=1; 
    foreach(getFiles() as $f){ 
     rename("../images/gallery/10/".$f, "../images/gallery/10/".$i.".jpg"); 
    $i++; 
    } 
    ?> 
0

尝试设置阵列外循环,和排序,所以它会在一个令不会留下任何空白解析它:

$i=0; 
$array = array_filter(glob("../images/gallery/10/*") ,"is_file") 
sort($array); // See which type of sort is needed here 
foreach ($array as $f){ 
    rename($f, "../images/gallery/10/". ++$i .".jpg"); 
} 

不管怎么说,避免循环语句中使用的功能,因为它将被重新评估为无。

0
$i=1; 
foreach (array_filter(glob("../images/gallery/10/*") ,"is_file") as $f){ 
    if (!file_exists("../images/gallery/10/".$i.".jpg)){ 
    rename($f, "../images/gallery/10/".$i.".jpg"); 
    } 
    $i++; 
}