Дек 122013
 

Привет.
Недавно для статистики потребовалось определить страны по городу. В результате был собрана БД и написан класс-обертка, который осуществляет поиск по данным.
В базе 243 страны и 54,912 города, в большинстве случаев этого хватает.
Сама БД представляет из себя один JSON файл весом в 4.7 мб, класс-обертка — пару функций для быстрого поиска.
Описание функций:

array GetCountryNames ( [bool $isRussian = true] )
Возвращает массив названий всех стран, содержащихся в БД. 
$isRussian - отдавать названия на русском языке.
 
array GetCountryCodes ( void ) 
Возвращает массив всех кодов стран.
 
string GetCountryCodeByCityName ( string $city )
Возвращает код страны по названию одного из ее городов.
$city - название города (на английском или русском языке). Может быть регулярным выражением.
 
array GetCitiesByCountryCode ( string $code [, bool $isRussian = true] )
Возвращает массив названий всех городов, которые есть в данной стране.
$code - код страны.
$isRussian - отдавать названия на русском языке.
 
string GetCountryNameByCountryCode ( string $code [, bool $isRussian = true] )
Возвращает название страны по ее коду.
$code - код страны.
$isRussian - отдавать название на русском языке.
 
string GetCountryCodeByCountryName ( string $country )
Возвращает код страны по ее названию.
$country - название страны (на английском или русском языке). Может быть регулярным выражением.

Пример использования:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
require('countrydetect.class.php');
$countryDetect = new CountryDetect('db.json');
$countryCode = $countryDetect->GetCountryCodeByCityName('Лаппеэнранта');
if($countryCode !== 'UNKNOWN')
{
	echo sprintf('Страна: %s (%s) (%s)', $countryDetect->GetCountryNameByCountryCode($countryCode), 
					     $countryDetect->GetCountryNameByCountryCode($countryCode, false), 
					     $countryCode);
        // Страна: Финляндия (Finland) (FI)
}
 
var_dump($countryDetect->GetCitiesByCountryCode($countryCode, false));
/*
array(216) {
  [0]=>
  string(8) "Helsinki"
  [1]=>
  string(6) "Vantaa"
  [2]=>
  string(5) "Espoo"
  [3]=>
  string(5) "Lohja"
  [4]=>
  string(6) "Raisio"
  [5]=>
  string(7) "Tampere"
...
*/

Скачать класс + БД: countrydetect.zip (718 кб)