Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сложный поиск для сравнения
 
 автор: медведь   (30.11.2008 в 19:36)   письмо автору
 
 

Речь идет о товаре и контактных телефонах продавца.
Данные о товаре сравнивать нельзя, поэтому я их выбросил, оставил только проблемный участок с телефонами.

На входе:
- массив с данными, которые нужно добавить в БД,
- данные в БД

структура БД:
id(ключ автоинк.) | tovar | tel1 | tel2
tel1 - не может быть NULL, tel2 - может быть NULL

структура массива(мне удобнее использовать массив массивов):
$arr_add[]=array('tovar' => $tovar, 'tel1' => $tel1, 'tel2' => $tel2, 'tel3' => $tel3, 'tel4' => $tel4);
tel1 - не может быть NULL, все остальные телефоны - могут

При формировании массива $arr_add я сразу пишу уникальные телефоны в массив $list_tels для запроса к БД

далее запрос к БД

SELECT DISTINCT ... FROM ... WHERE tel1 IN ('".$list_tels."') OR tel2 IN ('".$list_tels."');


Результаты пишу в массив:
$arr_duble[]=array('tovar' => $tovar, 'tel1' => $tel1, 'tel2' => $tel2);


Задача:
Вывести на экран по порядку все строки, исключив повторный вывод одной и той же строки,
из обоих массивов, где можно определить принадлежность товара одному и тому же продавцу (по номерам телефонов).

Вывести строки из массива $arr_duble, где tel1 или tel2 равен хотя бы одному из 4-х телефонов
массива $arr_add затруднений не вызывает, хотя, боюсь, что мной выбран не самый лучший вариант.

Я поступаю примерно так (основная суть):

открываю цикл for по количеству строк в массиве $arr_add,

определяю значение tel1 (номер телефона) массива $arr_add

ищу этот номер телефона по всем телефонам (tel1, tel2, tel3, tel4) массива $arr_add
если нахожу - вывожу на экран всю строку, а строку исключаю из поиска, чтобы она "не нашлась"
второй раз по какому-то другому телефону.

потом ищу этот же телефон(tel1) по всем телефонам(tel1, tel2) массива $arr_duble
если нахожу - вывожу на экран всю строку, а строку исключаю из поиска, чтобы она "не нашлась"
второй раз по какому-то другому телефону.

далее определяю значение tel2 массива $arr_add и по той же схеме ищу.


Пример проблемы:

Массив $arr_add

1 | tovar | tel1=111 | tel2=222 | tel3=333 | tel4=444
2 | tovar | tel1=222 | tel2=111 | tel3=777 | tel4=888
3 | tovar | tel1=999 | tel2=666 | tel3=222 | tel4=555

Массив $arr_duble

1 | tovar | tel1=555 | tel2=567
2 | tovar | tel1=101 | tel2=444
3 | tovar | tel1=567 | tel2=202

Анализируем tel1[1] массива $arr_add:
tel1[1]=111 - найден в tel2[2] $arr_add
tel2[1]=222 - найден в tel1[2], tel3[3] $arr_add
tel3[1]=333 - не найден нигде
tel4[1]=444 - найден tel2[2] $arr_duble

Выводим:
1 строку массива $arr_add
2 строку массива $arr_add
3 строку массива $arr_add
2 строку массива $arr_duble

Но в каждой найденной строке есть дополнительные телефоны
и получается, что прежде, чем переходить к поиску по телефонам второй строки массива $arr_add (вторая итерация цикла for)
нужно "доискать" в обоих массивах те телефоны, которые присутствуют в найденной строке, но отсутствуют в искомых телефонах.

Т.е. в найденной 2-й строке массива $arr_add, кроме телефона "222", есть еще телефон "111",
по которому мы уже искали, но есть еще и телефон "777" и "888", по которым мы не искали, а искать нужно.

Единственное, что мне приходит в голову - это дописать такие телефоны в еще один массив и в этой же итерации
"доискать", но в найденных вариантах тоже могу быть дополнительные телефоны...

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования