Сравнение большого количества данных с базой

zip111

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

Суть проблеммы:

Просматриваю папку с файлами, в которой N файлов. Мне нужно потом названия этих файлов сравнить с полем в MySQL в котором находится копия названий этих файлов на наличие новых файлов в папке.

Я так подумал есть несколько путей решения:
1. Сделать проверку циклом и крутить пока не просмотрит все файлы и названия в таблице. Так сервак 100% ляжет.
2. Сделать запрос типа select name where field like $name. Так тут загвоздка в том, что проверить нужно большое кол-во файлов и опять циколм придется отправлять огромное кол-во запросов.

Может, есть какой-то альтернативный вариант?
 

Мутник

Новичок
да не ляжет у тебя сервер, если ты сначала в один массив засунешь все содержимое директории, а во второй -список из БД ОДНИМ запросом. Потом сравнишь и добавишь новые...
это все будет ООчень быстро..

p.s. что такое большое кол-во файлов??
p.p.s. перед тем как спросить - попробуй оба варианта, засеки время и посмотри что к чему... а то чистая теория - она и есть теория.
 

zip111

Новичок
Большое кол-во файлов - это где-то около 10.000 штук и будет добавляться еще.

спасибо за идею, сейчас буду пробывать

-~{}~ 04.05.05 02:29:

Да, а кстати, как сравнить два массива? Два цикла пускать?

получается если один, то он проверит только array[0] второго массива, так ведь?

если не влом примерчик накатай.
 

Мутник

Новичок
примерчик катать не буду....

просто если два цикла, то 10.000х10.000 = довольно много.. Подумай, может чего прийдет в голову.

в некоторых случаях, думаю, тебе могут помочь ассоциативные массивы, типа:

PHP:
$array = array(
                 "mysong.mp3" => 1,
                 "image.jpg" => 1,
);
но опять же, с этим надо быть аккуратнее... Зато, это в 10.000 раз быстрее
 

zip111

Новичок
а что ассоциативные массивы? Все равно же придеться проверять 10.000х10.000. Или я чего то не догнал? Почему оно будет быстрее?
 

SiMM

Новичок
Недогнал.
PHP:
foreach ($mysql as $data) unset($files[$data['filename']]);
Если в $files (индексами в котором являются имена файлов) остался хоть один элемент, значит, индексы этих элементов массива и являются именами новых файлов, которые и надо записать в базу.
 

SelenIT

IT-лунатик :)
А [m]array_diff[/m] для той же цели не подойдет? Просто интересно...
 

zip111

Новичок
SiMM

ага понятно, счас буду пробывать. А вообще первый раз с такой ситуацией столкнулся, интересно...
 

SiMM

Новичок
> А array_diff для той же цели не подойдет?
А почему бы и нет? :)
 

zip111

Новичок
Замутил с array_diff - действительно хороший вариант.
только походу дела столкнулся с такой бедой:

оно возвращает массив в таком формате например:

1=>green, 2=>blue, 5=yellow, 7=>red

как реорганизовать массив, что бы шло по порядку:

1=>green, 2=>blue, 3=yellow, 4=>red

?
 

zip111

Новичок
Ну, а как же тогда сохранить массив в базе? Я так подрозумеваю, что нужно сделать типа того:

PHP:
for ($i=0;$i<count($array);$i++) {
mysql_query("insert into base values ('".$array[$i]."')");
}
просто если массив не привести в порядок то сами понимаете, что он добавит не весь массив.
 
Сверху