Доброго времени суток.
Поступила задачка отыскать в базе данных пользователей записи, пытаясь найти все совпадения. Знаю что прозвучало это слегка "загадочно", потому попросту перейду к примеру:
Человек пытается найти запись: Карлов Иван Исаакович
Вводя это в строку поиска, система получает одну целую строку, разбивает её элементы массива, ориентируясь на пробел, все лишние элементы отсекает, и пытается найти всевозможные вариации строки Карлов Иван Исаакович, а именно:
Карлов Иван Исаакович
Иван Карлов Исаакович
Исаакович Иван Карлов
Карлов Иван
Иван Карлов
...
Исаакович
...
Разбить массив на элементы, отсечь лишнее и вручную вписать все вариации запросов к БД, ориентируясь на первоначальное к-во элементов(допустим их не 3 а 2 или 1), конечно можно, но хотелось бы услышать ответ на вопрос: Можно ли както автоматизировать процесс перебора элементов массива?
Заранее благодарен за любую полезную информацию.
1. SunChase - 10 Ноября, 2011 - 17:21:12 - перейти к сообщению
2. Stierus - 10 Ноября, 2011 - 17:30:05 - перейти к сообщению
Я бы хранил ключ, который был бы md5 от отсортированных ФИО и искал по ним, не ?
скажем так:
Иванов
Акакий
Валерьевич
приводилось бы к md5(АкакийВалерьевичИванов) и сохранялось
Яковлев
Шамиль
Арсеньевич
приводилось бы к md5(АрсеньевичШамильЯковлев)
и тд
Это если решать вашу задачу в лоб, а так можно и над более элегантным решением подумать ... к чему это я? К тому, что у вас задача первоначально немного иная - найти совпадения, может быть решена более простым и быстрым вариантом
(Добавление)
разбить строку в массив http://ru.php.net/manual/en/function.explode.php
пройтись по массиву foeach()
Ну или регулярки
скажем так:
Иванов
Акакий
Валерьевич
приводилось бы к md5(АкакийВалерьевичИванов) и сохранялось
Яковлев
Шамиль
Арсеньевич
приводилось бы к md5(АрсеньевичШамильЯковлев)
и тд
Это если решать вашу задачу в лоб, а так можно и над более элегантным решением подумать ... к чему это я? К тому, что у вас задача первоначально немного иная - найти совпадения, может быть решена более простым и быстрым вариантом
(Добавление)
разбить строку в массив http://ru.php.net/manual/en/function.explode.php
пройтись по массиву foeach()
Ну или регулярки
3. SunChase - 10 Ноября, 2011 - 17:39:08 - перейти к сообщению
foreach если не ошибаюсь ориентирован на каждый элемент массива в отдельности, и будет иметь к-во циклов, равное к-ву элементов массива(поправьте, если неправ), тобиш 3. Тут же из 3х элементов получается как минимум 14 вариантов...
Конечно можно воспользоваться foreach и применить для поиска каждый элемент в роле Фамилии, Имя или Отчества, но это будет иметь меньшую точность...
Конечно можно воспользоваться foreach и применить для поиска каждый элемент в роле Фамилии, Имя или Отчества, но это будет иметь меньшую точность...
4. DeepVarvar - 10 Ноября, 2011 - 17:57:39 - перейти к сообщению
А что мешает динамически нарисовать запрос вида:
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- WHERE f1 LIKE '%фыва%' OR f2 LIKE '%фыва%' OR ... fN LIKE '%фыва%'
Количество полей известно заранее и равно трем.
Задача не тривиальна..
Если искать по трем словам, то к каждому полю всего три варианта LIKE..
А чтобы не искали по длинным словам, резать их, а чтобы не искали по 10 словам (такое только гугл себе позволить может), ограничиваться максимум, скажем, четырьмя первыми.
(Добавление)
Еще есть оч хорошая штука - FULLTEXT