Задать вопрос
@life_fox

Как средствами php сравнить два больших массива?

Здравствуйте, добрые люди.

Задача: имеется
- папка с картинками (примерно 500 мб)
- база данных(таблица) в которой указаны название картинок (MySQL - 100 тыс. строк)

Надо сравнить название картинок из папки с базой данных и выявить лишние названия картинок

Буду очень благодарен.
Заранее спасибо.
  • Вопрос задан
  • 5017 просмотров
Подписаться 3 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@kaasius
Воу-воу, палехчи. Это всё очень круто. Но имеет избыточную сложность, особенно в плане расхода памяти. Как бы сделал я:
1. Сделал бы список файлов в папках (find /path/to/folder -name "*.jpg" >filelist.txt)
2. Грузим в php скрипте файлик file("filelist.txt") - он при этом грузится как массив. Алсо, чтобы экономить память, можно читать через fgets - немного сложнее, но зато веселее.
3. Пробегаем по этому массиву и ищем в БД. Поле с именем файла должно быть индексировано конечно.
Все файлы, что не найдены, удаляем.

Альтернативный вариант - загрузить из БД все записи в виде хеш-таблицы (то есть имена из БД должны стать индексами массива, а значениями - да что угодно). Дальше поиск производить как isset($hash[$name]).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
konst20
@konst20
Программист, преподаватель, немного электронщик
1. Формируем массив array1 - имена файлов в папке - ф-я scandir

2. Формируем массив array2 - названия в БД, выборка наподобие
SELECT image_name FROM my_db
выбираем только имена image_name, то есть названия.

Форматы названий должны совпадать, то есть одинаковые картинки и в БД, и в папке должны иметь абсолютно одинаковые имена, с учетом того, что файлы в папке имеют еще и расширения. Если что - приводим строковыми ф-ями к одинаковому формату (отрезаем расширение файла например)

3. Ф-я array_diff(array1, array2) даст те элементы, которые есть в массиве array1, но нет в массиве array2.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
1. Получить список файлов из папки.
2. Получить список файлов из базы.
3. Отсортировать оба списка по алфавиту (можно прямо на шагах 1 и 2, но надо чтобы порядок сортировки был одинаковым).
4. Построчно сравнивать списки, отмечая те строки, которые есть только в одном списке.
Ответ написан
Комментировать
В базу добавляем поле-ключ "найдено/не найдено", делаем поле с названием файла тоже ключевым. Далее создаём список файлов и начинаем поиск по базе среди "не найденых" изображения. Найденные изображения помечаем.
Ответ написан
Комментировать
Не понял, Вам решить эту задачу надо? Или, подсказать решение?
Если решить, то, я думаю - Вам лучше на фрилансим сходить - Вам там за пару единиц с двумя нулями - Вам эту задачу решат.

Если просто подсказать:
Ну тут, особо ничего сложного.
Самое просто решение:
Бегите по строкам в таблице в БД. Проверяйте есть такой файл или нет. Если нет, сохраняйте решение куда-либо.
Ответ написан
Комментировать
konst20
@konst20
Программист, преподаватель, немного электронщик
Я обращу внимание на то, что предлагавшиеся выше решения в духе "бегите по строкам" и "построчно сранивайте" в данном случае имеют сложность до О(n*n), то есть придется сделать 100000*100000 = примерно 10 миллардов операций.
боюсь, это может затянуться на несколько часов.
Ответ написан
Вам стоит обратить внимание на стандартную библиотеку примитивов SPL.
FixedArray и RecursiveDirectoryIterator помогут значительно ускорить обработку.
Также через pcntl_fork или pthread'ы можно распределить задачу по нескольким потокам или процессам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽