Конвертировать коды стран
Существует несколько методов для кодов стран.
У меня есть список кодов с 3-символами, например на этой странице:
http://www.fina.org/H2O/index.php?option=com_content&view=category&id=93:asia&Itemid=638&layout=default
Есть ли простой способ конвертировать их в 2-символьные? Как "PT" из "POR" для Португалии.
Стандарт для двух символов - http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
Спасибо.
Ответы
Ответ 1
Не будет простого способа, потому что в названиях страны нет конкретной схемы. Например PT
от POR
для Portugal
, и это может быть другим для других стран. Возможно, вы захотите создать массив для хранения двух букв для каждой страны.
Пример:
$countries = array('PT' => 'Portugal', 'UK' => 'United Kingdom');
Ответ 2
Есть несколько полезных файлов данных, которые вы можете получить из http://country.io/data, которые помогут вам:
Если вы просто хотите перейти от 3 буквенных кодов к двум буквенным кодам, вы можете просто перевернуть первую карту и использовать ее. Вы можете создать карту, которая идет непосредственно из трех буквенных кодов в названия стран, расчесывая файлы. Вот простой пример PHP:
$codes = json_decode(file_get_contents('http://country.io/iso3.json'), true);
$names = json_decode(file_get_contents('http://country.io/names.json'), true);
$iso3_to_name = array();
foreach($codes as $iso2 => $iso3) {
$iso3_to_name[$iso3] = $names[$iso2];
}
echo $names("PL"); // => "Poland"
echo $iso3_to_map("POL"); // => "Poland"
Ответ 3
Без фактического поиска нет простого способа: AFG (Афганистан) становится AF, а AND (Андорра) становится AD, а BLR (Беларусь) становится BY... поэтому вы не можете делать никаких простых манипуляций с персонажами для преобразования.
Мое предложение состояло в том, чтобы использовать таблицу countrycode или добавить дополнительный столбец в любую существующую таблицу, чтобы вы сохраняли оба кода.
Ответ 4
В gis.stackexchange есть аналогичный вопрос.
https://gis.stackexchange.com/questions/603/is-a-country-state-city-database-available
Я думаю, вы получите больше информации, разместив эти вопросы в gis.
http://gis.stackexchange.com
Ответ 5
Большинство других ответов выше не являются прямыми ответами. Позвольте мне попробовать
Я попробовал ниже код для преобразования 3-символьных символов в 2-символьный код страны с помощью API:
<?php
$list=["BWA","SLV","TZA","BRB","IND","BES","ANT"];
$iso3=file_get_contents('http://country.io/iso3.json');//load the country codes
$iso3=json_decode($iso3,true);//convert json to associative array
foreach($list as $k)
{
if($k=="ANT")//not defined in code list
echo "AN";
else
echo array_search($k,$iso3);
echo "<br/>";
}
?>
Предоставляемые коды стран представлены в виде 2-iso (ключ): 3-iso (значение). Поэтому вместо поиска ключа я искал значение и возвращал первый соответствующий ключ в случае успеха.
Выход
BW
SV
TZ
ВВ
В
BQ
AN
Минусы -
ANT
код страны не указан в списке кодов.
Ссылка - array_search
Ответ 6
В то время как это может быть длинным и болезненным методом, может быть полезно потратить время на создание функции, которую вы можете сохранить навсегда больше, возможно, это может указывать вам в правильном направлении:
<?php
function myCodes($in, $type){
$out = "";
$long = array('portugal', 'united kingdom');
$short = array('pt', 'uk');
$in = strtolower(trim($in));
switch($type){
case 'long':$out = str_replace($short, $long, $in);break;
case 'short':$out = str_replace($long, $short, $in);break;
}
echo $out;
}
echo myCodes('United Kingdom', 'short'); //this will echo 'uk'
echo myCodes('UK', 'long'); //this will echo 'united kingdom'
?>
Это, конечно же, будет иметь несколько недостатков, например, чтобы массивы для длинного и короткого совпадений соответствовали положению, и вам также нужно будет поддерживать эту функцию.
Ответ 7
Для тех, кто занимается этим, я сделал JSON-сопоставление альфа3-альфа2.
Скачать здесь: https://api.myjson.com/bins/1y2hn
Итак, вы просто назначили этот JSON объекту (пример countryCodes). Теперь преобразование просто:
countryCodes["US"] //"USA"
Ответ 8
Я вижу, что вопрос был задан семь лет назад. Сегодня у меня была аналогичная проблема, и я нашел одно хорошее решение. Надеюсь, что этот ответ будет полезен другим, у кого будет такая же проблема в будущем.
Существует отдельная библиотека, которая может быть использована https://github.com/thephpleague/iso3166
Тогда решение было бы простым. $alpha3 - это три представления char страны. И alpha2 - это два представления страны char.
-
$ composer require league/iso3166
-
$data = (new League\ISO3166\ISO3166)->alpha3($alpha3);
-
Данные выглядят следующим образом:
[
'name' => 'Netherlands',
'alpha2' => 'NL',
'alpha3' => 'NLD',
'numeric' => '528',
'currency' => [
'EUR',
]
]
-
$countryCodeInTwoChar = $data['alpha2']
Ответ 9
$mapping ['POR'] = 'PT';
$ shortcode = $mapping [$ longcode];
Ответ 10
В рубине вы можете сделать это следующим образом:
(получите countryInfo.txt из http://download.geonames.org/export/dump/)
require 'csv'
countries_iso3_map = {}
CSV.foreach('countryInfo.txt',:col_sep=>' ',:row_sep =>:auto) do |row|
next if row[0][0] == '#' #ignore comments section
countries_iso3_map[row[0][0,2]]= row[1][0,3]
end
p countries_iso3_map['PT']
Ответ 11
Основанный на Json массив с кодами ISO 3, но не отсортированный
Вставить Bin Link
И PHP-массив
Вставить BIN PHP Array