国際電話番号のリストと国の電話番号のリストがあります。
数字から国を特定したいのですが、迅速かつエレガントな方法が見つかりません。
何か案が?私が得たのは、ハードコードされたチェックを行うことだけです(たとえば、「最初の数字を見て、2番目の数字を見てください。Xの場合は3番目の数字を確認します。2番目の数字がYの場合、国はFooです」など) .)。リストには PHP と DB (MySQL) を使用していますが、疑似コードが役立つと思います。
国際電話番号のリストと国の電話番号のリストがあります。
数字から国を特定したいのですが、迅速かつエレガントな方法が見つかりません。
何か案が?私が得たのは、ハードコードされたチェックを行うことだけです(たとえば、「最初の数字を見て、2番目の数字を見てください。Xの場合は3番目の数字を確認します。2番目の数字がYの場合、国はFooです」など) .)。リストには PHP と DB (MySQL) を使用していますが、疑似コードが役立つと思います。
または、 Twilio Lookupなどのツールを使用することもできます。
Lookup で API リクエストを行うと、CountryCode
常にプロパティが返されます。
https://www.twilio.com/docs/api/lookups#lookups-instance-properties
[開示:私はTwilioで働いています]
ハードコーディングされたチェックは、呼び出しコードのリストから自動的に生成される決定ツリーに変換できます。ツリーの各ノードは、「現在の」文字、可能性のある次の文字 (ツリー ノード) のリスト、またはターミナル ノードの場合は国を定義します。ルート ノードは先頭の '+' 記号になります。
最初の番号から始めて、2番目の番号、というように、それが見つかるまで簡単に検索できます。これは、発信コードが別のコードのプレフィックスではないため、正しく機能します。つまり、国際通話コードは「プレフィックスコード」を形成します(電話システムはこのプロパティに依存します)。
私はPHPが得意ではないので、ここに単純なpython実装があります。うまくいけば、フォローするのは簡単です:
>>> phone_numbers = ["+12345", "+23456", "+34567", "+45678"]
>>> country_codes = { "+1": "USA", "+234": "Nigeria", "+34" : "Spain" }
>>> for number in phone_numbers:
... for i in [2, 3, 4]:
... if number[:i] in country_codes:
... print country_codes[number[:i]]
... break
... else:
... print "Unknown"
...
USA
Nigeria
Spain
Unknown
基本的に、プレフィックスと国の間に連想配列があります(これは、ウィキペディアの記事から簡単に生成できると思います。連想配列で電話番号の最初の桁を検索してみてください。配列にない場合は、最初の2つを試してください。 3桁の後に一致するものがない場合、この番号は有効な国際発信コードで始まりません。