Поиск совпадения имени файла в двух каталогах и запись совпадающего имени файла в массив

#php

#php

Вопрос:

Я искал в Stackover аналогичную проблему, но не могу найти решения.

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

Первое, что я делаю, это использую «scandir» для создания массива данных из первого каталога. В цикле «foreach» просмотрите массив из результата «scandir» и выполните команду «file_exists», используя переменную «$image1», чтобы найти совпадение в секундном каталоге «allimages / boardsclean». Если совпадение найдено, запишите имя файла в массив «$found_images».

Тестируя результат массива «$found_images», я не вижу ожидаемого результата.

Может ли кто-нибудь увидеть, где я ошибаюсь?

 $c1 = 0;
$c2 = 0;
$scan = scandir('allimages/temp1');

$found_images = array();
foreach ($scan as $image1) {
    if (file_exists('allimages/temp1/'.$image1) amp;amp; ('allimages/temp2/'.$image1)) {
            echo "file match in Scan $image1</br>";
            $found_images[] = 'allimages/adminclean/'. $image1;
      $c1  ;
        } 
}
echo $c1."</br>";

foreach ($found_images as $image3) {
    echo "file match $image3 </br>";
    $c2  ;
}
echo $c2."</br>";
 

Комментарии:

1. amp;amp; ('allimages/temp2/'.$image1) это выглядит немного неуместно.

2. @Remy Привет, когда ты говоришь «это выглядит немного не так», что ты имеешь в виду?

3. Я бы предположил, что вы хотите проверить, существует ли этот файл, теперь он заключен только в круглые скобки. Ваше текущее условие будет оцениваться true как, если file_exists('allimages/temp1/'.$image1) теперь true . Итак, я предполагаю, что вы хотели протестировать: file_exists('allimages/temp1/'.$image1) amp;amp; file_exists('allimages/temp2/'.$image1)

4. @Remy Смотрит на строку «if (file_exists(‘allimages/ temp1/’.$image1) amp;amp; (‘allimages/ temp2/’.$image1)) {» для меня это выглядит правильно. Это не приводит к каким-либо синтаксическим ошибкам.

5. это синтаксически правильно, но это логическая ошибка : p. ('allimages/temp2/'.$image1) это не проверяет наличие файла.

Ответ №1:

Во-первых, вам не нужно проверять наличие файла из scandir , потому что, ну … он уже есть и был возвращен. Во-вторых, вы не проверяете имя файла во втором каталоге. Вам нужно:

 if(file_exists('allimages/temp2/'.$image1)) {
 

Однако просто просканируйте оба каталога и вычислите пересечение возвращенных массивов, что даст вам файлы, общие для обоих каталогов. Это так же просто, как:

 $found = array_intersect(scandir('allimages/temp1'), scandir('allimages/temp2'));
 

Затем вы можете отфильтровать каталоги, если хотите, и добавить allimages/adminclean/ в массив или при необходимости.

Комментарии:

1. Привет, большое спасибо за ваш реплей. Я не думал использовать array_intersect. Работает отлично. После заполнения массива $found я затем использовал $result = array_unique($found); для удаления любых повторяющихся имен файлов.