Преобразование кодов стран


Существует несколько методов определения кодов стран.

У меня есть список кодов с 3 символами, как на этой странице:

Http://www.fina.org/H2O/index.php?option=com_content&view=category&id=93:asia&Itemid=638&layout=default

Есть ли простой способ преобразовать их в 2 символа?, например, "PT" из "POR" для Португалии.

Стандарт для 2 символов - http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

Спасибо.

Author: Gumbo, 2010-08-11

11 answers

Простого пути не будет, потому что в названиях стран нет определенной схемы. Например, PT из POR для Portugal, и это может отличаться и для других стран. Возможно, вам захочется создать массив для хранения двух букв для каждой страны.

Пример:

$countries = array('PT' => 'Portugal', 'UK' => 'United Kingdom');
 -2
Author: Sarfraz, 2010-08-11 08:27:50

Есть несколько полезных файлов данных, которые вы можете получить из http://country.io/data это поможет вам:

Если вы просто хотите перейти от 3-буквенных кодов к 2-буквенным кодам, вы можете просто перевернуть первую карту и использовать ее. Вы могли бы создать карту, которая идет непосредственно из 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"
 20
Author: Ben Dowling, 2015-07-30 07:50:38

Без фактического поиска простого способа нет: AFG (Афганистан) становится AF, в то время как И (Андорра) становится AD, а BLR (Беларусь) становится BY... таким образом, вы не можете выполнять какие-либо простые манипуляции с символами для преобразования.

Мое предложение состояло бы в том, чтобы использовать таблицу кодов стран или добавить дополнительный столбец в любую существующую таблицу, чтобы вы содержали оба кода.

 3
Author: Mark Baker, 2010-08-11 08:27:13

Я вижу, что этот вопрос был задан семь лет назад. Сегодня у меня была похожая проблема, и я нашел одно хорошее решение. Надеюсь, что этот ответ будет полезен другим, у кого в будущем возникнет такая же проблема.

Существует отдельная библиотека, которую можно использовать https://github.com/thephpleague/iso3166

Тогда решение было бы простым. $alpha3 - это представление страны тремя символами. И alpha2 - это представление двух символов страна.

  1. $ composer require league/iso3166
  2. $data = (new League\ISO3166\ISO3166)->alpha3($alpha3);
  3. Данные выглядят следующим образом:

    [
      'name' => 'Netherlands',
      'alpha2' => 'NL',
      'alpha3' => 'NLD',
      'numeric' => '528',
      'currency' => [
        'EUR',
        ]
    ]
    
  4. $countryCodeInTwoChar = $data['alpha2']
 3
Author: Turdaliev Nursultan, 2017-08-29 08:54:24

Аналогичный вопрос есть в gis.stackexchange.
https://gis.stackexchange.com/questions/603/is-a-country-state-city-database-available
Я думаю, что вы получите больше информации, разместив эти вопросы в гис. http://gis.stackexchange.com

 2
Author: CoderHawk, 2017-04-13 12:33:45

Для всех, кто занимается этим, я сделал сопоставление JSON с alpha3 на alpha2. Скачать можно здесь: https://api.myjson.com/bins/1y2hn

Таким образом, вы просто назначили бы этот JSON объекту (например, кодам стран). Теперь преобразование - это просто: countryCodes["US"] //"USA"

 2
Author: MikeX, 2016-07-27 10:20:39

Большинство других приведенных выше ответов не являются прямыми ответами. Позвольте мне попробовать

Я попытался ниже кода преобразовать 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

СВ

TZ

ВВ

В

BQ

И

Минусы -

ANT код страны не определен в списке кодов.

Ссылка - массив_смотр

 2
Author: Rohan Khude, 2016-11-05 21:27:34

Хотя это может быть длительный и болезненный метод, он вполне может стоить того, чтобы вы написали функцию, которую вы можете сохранить навсегда, возможно, это может указать вам в правильном направлении:

<?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'

?>

Это, конечно, будет иметь несколько недостатков, таких как обеспечение того, чтобы массивы для длинных и коротких совпадали по положению, и вам также нужно будет поддерживать эту функцию.

 1
Author: SimonDowdles, 2010-08-11 08:39:15

Массив на основе Json с кодами ISO 3, но не отсортированным

Вставить Ссылку На Корзину

И Массив PHP Вставить PHP-массив BIN

 1
Author: Mudasar Rauf, 2017-03-23 21:44:44

$отображение['POR'] = 'PT';
$короткий код = $сопоставление[$длинный код];

 0
Author: Im0rtality, 2010-08-11 08:26:47

В ruby вы можете сделать это так: (получить 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']
 0
Author: tiagomatos, 2011-07-20 21:37:47