2013-06-07 2 views
0

Я работаю с копированием файлов, я могу скопировать один файл в несколько папок, но у меня возникли проблемы при копировании нескольких файлов в несколько папок.PHP Как копировать несколько файлов в несколько папок

Мой код:

$sourcefiles = array('./folder1/test.txt', './folder1/test2.txt'); 

$destinations = array('./folder2/test.txt', './folder2/test2.txt'); 

//do copy 

foreach($sourcefiles as $source) { 

    foreach($destinations as $des){ 
     copy($source, $des); 
    } 

} 

Но этот код не работает!

Не могли бы вы дать мне решение :(

Спасибо за любую помощь!

+0

У вас не хватает $ до источника в copy(); –

+0

похоже, что вы пропустили $ там в копии (источник, $ des) –

+0

нет, я пропустил $, но это не проблема: 9 – johnITBonuc

ответ

5

Что вы сейчас делаете зацикливаетесь на исходниках, которые, в первую itteration являются «test.txt», а затем вы мертвый массив назначения и выполняет функцию копирования 2 раза:

1-й итерацию с folder1/test.txt

  • копия ("folder1/test.txt", "folder2/test.txt");
  • копия ("folder1/test.txt", "folder2/test2.txt";

второй итерации с Folder1/test2.txt:

  • копия ("folder1/test2 .txt», "folder2/test.txt");
  • копия ("folder1/test2.txt", "folder2/test2.txt";

В конце концов вы переписаны оба файла последний файл в вашем $ source массиве. Так как файлы в «folder2» содержат данные test2.txt

Что вы ищете будет:

foreach($sourcefiles as $key => $sourcefile) { 
    copy($sourcefile, $destinations[$key]); 
} 

$ SourceFile равна $ исходников, [$ ключ] в приведенном выше примере.

Это основано на том факте, что PHP автоматически назначает ключи вашим значениям. $ sourcefiles = array ('file1.txt', 'file2.txt'); могут быть использованы в качестве:

$sourcefiles = array(
    0 => 'file1.txt', 
    1 => 'file2.txt' 
); 

Другим вариантом является использование длины одного из массивов в цикле, который делает то же самое, но по-другому:

for ($i = 0; $i < count($sourcefiles); $i++) { 
    copy($sourcefiles[$i], $destinations[$i]); 
} 
+1

Хороший ответ. Хотя, поскольку мы не работаем с ассоциативными массивами, я бы использовал ваниль для цикла, а не foreach. Тем не менее, это сработает. –

+0

Я добавлю опцию for-loop, спасибо :-) –

+0

спасибо, это работает! – johnITBonuc

0

Конечно, нет. Ваша вложенной цикл копирования файлов таким образом, что они связаны перезаписать предыдущие копии файлов . Я думаю, вам нужно использовать более простое решение Копирование в вложенном цикле не имеет никакого смысла

Если у вас есть файлы источника и назначения, то я предлагаю один цикл:..

$copyArray = array(
    array('source' => './folder1/test.txt', 'destination' => './folder2/test.txt'), 
    array('source' => './folder1/test.txt', 'destination' => './folder2/test.txt')); 

foreach ($copyArray as $copyInstructions) 
{ 
    copy($copyInstructions['source'], $copyInstructions['destination']); 
} 

Но убедитесь, что имена ваших файлов назначения разные!

+0

да, вы правы, я хочу только скопировать файлы в папки, а мой код переписать файл, что я могу решить эту проблему? – johnITBonuc

+1

@ AD7six Извините, вы правы, обновлено с помощью решения – dKen

1

Я думаю, что вы пытаетесь это сделать;

for ($i = 0; $i < count($sourcefiles); $i++) { 
    copy($sourcefiles[$i], $destinations[$i]); 
} 

Ваш текущий код перезапишет предыдущие копии.

1

Предполагая, что вы есть равное количество файлов:

// php 5.4, lower version users should replace [] with array() 
$sources = ['s1', 's2']; 
$destinations = ['d1', 'd2']; 

$copy = []; 

foreach($sources as $index => $file) $copy[$file] = $destinations[$index]; 


foreach($copy as $source => $destination) copy($source, $destination); 
1

Поскольку вам нужен одинаковый индекс для обоих массивов, используйте for петлю.

for ($i = 0; $i < count($sourcefiles); $i++) { 
    //In here, $sourcefiles[$i] is the source, and $destinations[$i] is the destination. 
} 
Смежные вопросы