Моя цель - перенести первый файл, содержащий -3-sml в имени файла от temp до b2. Что делает мой код, так это перемещение каждого файла на b2. Почему это и что менять?
$name = "";
$dname = "";
$dir = new DirectoryIterator('temp/');
foreach ($dir as $fileinfo)
{
if (!$fileinfo->isDot())
{
if (substr($fileinfo->getFilename(),'-3-sml') !== false)
{
rename("temp/".$fileinfo->getFilename(), "b2/".$fileinfo->getFilename());
$name = $fileinfo->getFilename();
$dname = "http://domain.com/b2/".$fileinfo->getFilename();
break;
}
}
}
EDIT: я попробовал
if (substr($fileinfo->getFilename(),'-3-sml') !== false)
{
echo $fileinfo->getFilename()."<br>";
continue;
rename("temp/".$fileinfo->getFilename(), "b2/".$fileinfo->getFilename());
$name = $fileinfo->getFilename();
$dname = "http://oneitis.mygrabrede.de/b2/".$fileinfo->getFilename();
break;
}
и кажется, что substr($fileinfo->getFilename(),'-3-sml') !== false
не фильтрует ничего, поэтому каждое имя файла проходит. Зачем?
EDIT: Решение: оно должно быть strpos
не substr
.
Если вам нужно переместить только первый соответствующий файл, вы можете использовать glob и получить доступ к первому элементу array
, то есть:
$origin_path = "/somepath/temp";
$dest_path = "/somepath/b2";
$files = glob("$origin_path/*-3-sml*");
$fileName = basename($files[0]);
if(!is_dir("$dest_path")){
mkdir("$dest_path", 0777);
rename($files[0],"$dest_path/$fileName" );
}else{
rename($files[0],"$dest_path/$fileName" );
}
Если вам нужно выполнить поиск внутри нескольких подпапок, используйте эту рекурсивную функцию glob:
function rglob($pattern='*', $flags = 0, $path='')
{
$paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
$files=glob($path.$pattern, $flags);
foreach ($paths as $path) { $files=array_merge($files,rglob($pattern, $flags, $path)); }
return $files;
}
и перейти от
$files = glob("$origin_path/*-3-sml*");
в
$files = rglob("$origin_path/*-3-sml*");
Измените substr() на strpos() Substr для поиска подстроки
Strpos вернет позицию определенной строки