| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Поиск повторяющихся строк в многомерном массиве |
| Автор: rz3rr 11.5.2007, 15:24 |
| Есть массив, получаемый из mysql-базы $array['indx']['num']['seria']['fio'], состоящий из 15000 строк. Вопрос - как можно найти повторяющиеся записи по полям [num]&&[serial]. Если подробнее - таблица, в которой записаны номер и серия паспорта и ФИО владельца паспорта. Необходимо найти все поля с повторяющимися номерами и сериями паспортов. Все найденные записи выводятся в визуалную таблицу. Прямой "тупой" перебор с сравнением полей не выходит - вылетает по таймауту (больше 300 сек). Как можно выйти из этой ситуации? |
| Автор: WolfON 11.5.2007, 17:31 | ||
| Только не говорите мне, что вы всю базу из 15к строк грузите в массив О_О Пока в голову пришел лишь такой способ выбора повторяющихся записей:
|
| Автор: rz3rr 11.5.2007, 18:18 |
| Да, все 15к, в них повторяющихся записей может штук 500 наберется... Добавлено через 4 минуты и 6 секунд WolfON, ваш вариант так же не прокатывает - вылетает по таймауту. Мысль в голову пришла - отсортировать по num и seria, последовательно пробегать по записям и сравнивать следующую строку на одинаковость (кроме indx естесссно). |
| Автор: mishaSL 11.5.2007, 19:05 |
| rz3rr, эту задачу можно сделать на уровне SQL запроса. Покажите структуру вашей БД (точнее таблиц из которых идет выборка), и код которым вы получаете данные (в том числе SQL запрос). |
| Автор: WolfON 11.5.2007, 19:19 |
| Если база на Oracle - то PL/SQL в руки и все это делается за 5 минут Если что-нибудь другое, то прийдется поколдовать, но в любом случае - придумать ничего хуже, чем грузить 15к записей - нельзя. Используйте set_time_limit(0); Хотя я все-таки настаиваю на решении этой задачи с помощью SQL. |
| Автор: rz3rr 12.5.2007, 08:50 |
| База данных на mysql. Выборка производится только из одной таблицы где чуть более 40 полей. Запрос простой $qr=mysql_query("select indx,doc_serial,doc_number from persons_common where doc_serial!='' and doc_number!=''); Необходимо "выцепить" не только повторяющиеся записи, но и "с кем" они повторяются, для дальнейшей обработки. |
| Автор: Хрипа 12.5.2007, 12:32 |
| Это элементарно Сохраняишь массив в одну строку типа $d .="\".$array[$i]; при помоши регов ишеш совпадения фразы Потом бьёш строку Explode И выводишь в цикле всё пользывателю в таблицу.. Надеюсь автоматически генирируймую таблицу сможешь сделать. -*----- Что бы быстрей работало сделай функцией |
| Автор: WolfON 12.5.2007, 13:25 |
| Хрипа, представь сколько будет занимать памяти такая строка и сколько лет будет работать с ней регексп, а потом эксплод, если там 15000*(длина серии+длина номера) символов? ) |
| Автор: rz3rr 12.5.2007, 17:18 |
| Всё-таки, мысль, которая пришла ранее (отсортировать по num и seria, последовательно пробегать по записям и сравнивать следующую строку на одинаковость) оказалась на текущий момент самой быстрой - занимает около 3 секунд. |
| Автор: SelenIT 12.5.2007, 18:35 | ||||
| Требование единственного запроса критично? Что, если сначала получить все повторяющиеся серии:
(предполагается, что оба поля проиндексированы)? Не окажется ли быстрее, по крайней мере с точки зрения нагрузки на mysql-клиента... |
| Автор: rz3rr 13.5.2007, 12:22 |
| SelenIT, проиндексированы. Обработка производится на стороне mysql-сервера. Это разовая работа ("вычистить" таблицу от поторяющихся записей и поменять значения в связанных полях в других таблицах ). Пользователь к этому доступа иметь не будет. Это что-то администраторской функции. Дальнейшая задача уже будет не допускать ввода повторов (в обработчиках форм). К сожалению, разработка базы данных была произведена до меня. Я ограничен в возможностях модифицировать саму базу данных. А вот код обработки - да сколько угодно. Ладно, всем спасибо за обсуждение -тема закрыта. |