| Речь идет о товаре и контактных телефонах продавца.
Данные о товаре сравнивать нельзя, поэтому я их выбросил, оставил только проблемный участок с телефонами.
На входе:
- массив с данными, которые нужно добавить в БД,
- данные в БД
структура БД:
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", по которым мы не искали, а искать нужно.
Единственное, что мне приходит в голову - это дописать такие телефоны в еще один массив и в этой же итерации
"доискать", но в найденных вариантах тоже могу быть дополнительные телефоны...
В общем, запутался я. Надеюсь, что хоть кто-нибудь понял то, что я здесь расписал и опишет хотя бы словами правильный алгоритм. | |