Files

150 lines
3.6 KiB
PHP
Raw Permalink Normal View History

2026-06-03 12:10:25 +08:00
<?php
declare(strict_types=1);
namespace app\common\library;
/**
* ISO 3166-1 alpha-2 国家代码与中文名称
*/
class CountryIso
{
/**
* 常用投放国家 ISO2 => 中文名
*
* @var array<string, string>
*/
private const COUNTRIES = [
'CN' => '中国',
'HK' => '中国香港',
'MO' => '中国澳门',
'TW' => '中国台湾',
'US' => '美国',
'CA' => '加拿大',
'GB' => '英国',
'DE' => '德国',
'FR' => '法国',
'IT' => '意大利',
'ES' => '西班牙',
'NL' => '荷兰',
'BE' => '比利时',
'CH' => '瑞士',
'AT' => '奥地利',
'SE' => '瑞典',
'NO' => '挪威',
'DK' => '丹麦',
'FI' => '芬兰',
'IE' => '爱尔兰',
'PT' => '葡萄牙',
'PL' => '波兰',
'CZ' => '捷克',
'HU' => '匈牙利',
'RO' => '罗马尼亚',
'GR' => '希腊',
'RU' => '俄罗斯',
'UA' => '乌克兰',
'TR' => '土耳其',
'IL' => '以色列',
'SA' => '沙特阿拉伯',
'AE' => '阿联酋',
'QA' => '卡塔尔',
'KW' => '科威特',
'IN' => '印度',
'PK' => '巴基斯坦',
'BD' => '孟加拉国',
'TH' => '泰国',
'VN' => '越南',
'MY' => '马来西亚',
'SG' => '新加坡',
'ID' => '印度尼西亚',
'PH' => '菲律宾',
'JP' => '日本',
'KR' => '韩国',
'AU' => '澳大利亚',
'NZ' => '新西兰',
'BR' => '巴西',
'MX' => '墨西哥',
'AR' => '阿根廷',
'CL' => '智利',
'CO' => '哥伦比亚',
'PE' => '秘鲁',
'ZA' => '南非',
'EG' => '埃及',
'NG' => '尼日利亚',
'KE' => '肯尼亚',
];
/**
* 下拉选项 ISO2 => 中文名
*
* @return array<string, string>
*/
public static function getOptions(): array
{
return self::COUNTRIES;
}
/**
* 校验是否为合法 ISO2 代码
*/
public static function isValidCode(string $code): bool
{
$code = strtoupper(trim($code));
return isset(self::COUNTRIES[$code]);
}
/**
* 规范化并过滤国家代码列表
*
* @param array<int, string>|string $codes
* @return array<int, string>
*/
public static function normalizeCodes($codes): array
{
if (is_string($codes)) {
$codes = explode(',', $codes);
}
if (!is_array($codes)) {
return [];
}
$result = [];
foreach ($codes as $code) {
$code = strtoupper(trim((string)$code));
if ($code !== '' && self::isValidCode($code) && !in_array($code, $result, true)) {
$result[] = $code;
}
}
sort($result);
return $result;
}
/**
* 逗号分隔 ISO 代码转中文展示
*/
public static function codesToText(string $codes): string
{
if ($codes === '') {
return '';
}
$parts = [];
foreach (explode(',', $codes) as $code) {
$code = strtoupper(trim($code));
if ($code === '') {
continue;
}
$parts[] = self::COUNTRIES[$code] ?? $code;
}
return implode(',', $parts);
}
/**
* 数组转存储字符串
*
* @param array<int, string> $codes
*/
public static function codesToStorage(array $codes): string
{
return implode(',', self::normalizeCodes($codes));
}
}