Есть массив с адресами и названием файлов
Array (
[0] => /uploads/2017/04/provoloka.jpg
[1] => /uploads/2017/02/provoloka-vyazalnaya.jpg
)
Нужно скопировать все файлы в папк 1
, чтобы файлы имели вид
/1/uploads/2017/04/provoloka.jpg
Мой код
foreach ($value as $v) {//Перебираем массив
$v=substr($v,1);//Убираем первый знак - /
if (file_exists($v)) {//Проверяем существует ли фаил
if(!file_exists('1/'.$v)) {//Проверяем скопирован ли файл
//$t= explode('/', $v);//Из адреса делаем массив, чтобы убрать название файла
//$s = [];//Создаем пустой массив
//for($i=0; $i<count($t)-1; $i++) {//Перебираем массив с адресом файла
// $s[] = $t[$i];//Заносим все в массив
//}
//$d = implode('/',$s);//Получаем адрес к файлу без названия файла
$d = dirname($v);
if (file_exists($d)) {//Проверяем существует ли папка куда будем копировать
copy($v, '1/'.$v);//Если есть то копируем файл
} else {
mkdir('1/'.$d, 0777, true);//Если папки нет, то создаем ее
copy($v, '1/'.$v);// И копируем в нее файл
}
}
} else {
echo "The file $filename does not exist";
}
}
Проблема заключается в том, что он вместо файла создает папку
В чем моя ошибка?
Если директория создана, значит такой путь был передан в аргументе функции. Судя по вашему коду, возможны были два варианта. Первый - опечатка в mkdir("1/$v")
вместо $d
, вторая - цикл < count($t)
, вместо < count($t) - 1
, таким образом само имя файла тоже попадало в имя папки.
как мы уже выяснили проблема была в -1
Тем не менее, для решения задач старайтесь использовать подходящие инструменты. Например, не стоит разбирать пути самостоятельно, для этого есть соответствующие функции. Не стоит также и писать множество вложенных условий и т.п. Возможно лучше просто в несколько приемов подготовить данные, и потом также просто их обработать. Также постоянное конкатенация и вычисление пути повышает риск опечаток и снижает понятность и читаемость кода (не говоря уже о том, что при смене пути придется править каждую строку), а код должен быть прост как валенок, чем проще, тем лучше.
Вот пример кода (возможно с опечатками), в котором эти проблемы не так актуальны:
$files = [
"/uploads/2017/04/provoloka.jpg",
"/uploads/2017/02/provoloka-vyazalnaya.jpg"
];
// из какой директрию и в какую копируем
$sourceDir = dirname(__FILE__);
$targetDir = $sourceDir."1" ;
// пути для файлов
$data = array_map(function($f) use ($sourceDir, $targetDir){
return [
'from' => $sourceDir.$f,
'to' => $targetDir.$f,
];
}, $files);
// фильтруем только то, что действительно следует копировать
$data = array_filter($data, function($c){
return file_exists($c['from'])
&& !file_exists($c['to']);
});
// работаем с файлами
foreach($data as $c){
$d = dirname($c['to']);
if(!file_exists($d)){
mkdir($d, 777, true);
}
copy($c['from'], $c['to']);
}
для особых эстетов, можно сделать $data = array_column($data, 'to', 'from')
и цикл вида foreach($data as $from => $to){ ... }
Виртуальный выделенный сервер (VDS) становится отличным выбором
Дана строка с целыми числами от 1 до 500, разделенных запятымиЧисла могут повторяться