Как стать автором
Обновить

Комментарии 15

НЛО прилетело и опубликовало эту надпись здесь
Пока проект находится в закрытом тестировании. Здесь описан лишь алгоритм.
Не понял смысл статьи.
«У нас был файл, мы написали парсер, он распарсился».
Ну я каждый день такое делаю, так и шо?
Распарсить файл — практически всегда дело плевое… Однако в данном случае акцент нужно сместить в сторону: «как реализовать верный алгоритм». Ведь, впервые столкнувшись с подобной задачей, не мудрено наломать дров…
позволите, у меня небольшое замечание по коду. все-же, это не очень элегантное решение:
elseif (
   
mb_strpos(mb_strtolower($addrItem'UTF-8'), 'просп. ')
|| 
mb_strpos(mb_strtolower($addrItem'UTF-8'), ' просп.')
|| 
mb_strpos(mb_strtolower($addrItem'UTF-8'), 'пр-т')
|| 
mb_strpos(mb_strtolower($addrItem'UTF-8'), 'проспект')
)

Достаточно объявить всего две ф-ции:
function contains ($in$str) {
    return 
mb_strpos(mb_strtolower($in'UTF-8'), $str);
}
function 
containsOne ($in, array $array) {
    foreach (
$array as $str) {
        if (
contains($in$str)) {
            return 
true;
        }
    }
    return 
false;
}

и мы получаем намного более изящный результат, код уменьшается в раз 5 и становится намного более читаемым и расширяемым:
elseif (containsOne($addrItem, array('просп. '' просп.''пр-т''проспект')))


но рефакторить код есть куда. очень много мест. сейчас он вообще плох.
еще непонятно, что будет, если ищущийся итем стоит в начале строки. например «г. Такой-то, просп. Другой-то». Корректно проверять как
*корректно проверять так:
та блин. вот так, то есть сравнивая c false:
mb_strpos(mb_strtolower($in'UTF-8'), $str) === false;

Да, согласен. Код писался на скорую руку и очень сыр. Пусть не будет звучать как оправдание, но целью данного кода был разовый разбор имеющихся данных. Цель оправдывает средства.
я бы постеснялся выкладывать столь сырой код, да еще и сообщая, что это библиотека.
да и ведь неудобно так разрабатывать то было. задолбаться ведь можно
Первый – самый простой и не надежный: скормить адрес имеющихся фирм геокодеру Яндекса, который и разберет адрес на кусочки. Но есть и большой минус этого способа – если в базе геокодера такого адреса по какой то причине не окажется, то он вернет ближайшее к указанному месту строение…

а в чём тут проблема? он же сообщает с какой точностью найден объект: api.yandex.ru/maps/jsapi/doc/ref/reference/geocoderresult.xml#precision
Дело в том, что случаются моменты, когда дома, находящиеся по одной улице, могут находится в совершенно разных районах. Был такой случай, что геокодер определял дом, который находится не в соответствующем районе
нарисовать карты районов для всей России осилит не каждый
Они все уже нарисованы и храняться в wikimapia. Можно подключить слой от WikiMapia в Google Earth и сохранять полигоны в kml-файлы.

Я такое безобразие делал для сервиса частных объявлений о недвижимости. Способ, может быть и не совсем прямой, но для Нижнего его таки можно осилить =)
Спасибо, ваша статья очень помогла, а то я уже мозг взорвала над тем где мне все таки получить внутригородские р-ны в кладаре, а их так и нет вовсе
Зарегистрируйтесь на Хабре, чтобы оставить комментарий