我有一个像这样的国家的阵列
array(249) {
[0]=>
array(4) {
["country_id"]=>
string(1) "2"
["country_name_en"]=>
string(19) "Åland Islands"
["country_alpha2"]=>
string(2) "AX"
["country_alpha3"]=>
string(3) "ALA"
}
etc.
}
我想用第一个字母拆分它,所以我得到一个像这样的数组
array(26) {
'A' => array(10) {
array(4) {
["country_id"]=>
string(1) "2"
["country_name_en"]=>
string(19) "Åland Islands"
["country_alpha2"]=>
string(2) "AX"
["country_alpha3"]=>
string(3) "ALA"
}
etc.
}
etc.
}
但问题是国家/地区名称数组包含html实体作为第一个字符。
任何想法如何做到这一点?
提前致谢
彼得
答案 0 :(得分:2)
如果您希望在Åland Islands
下提交A
,则需要比已建议的html_entity_decode()多一点。
intl包含Normalizer::normalize(),一个将Å
转换为Å
的功能。困惑了吗?该unicode符号(U + 00C5)可以用UTF-8表示为0xC385
(组合)和0x41CC8A
(分解)。 0x41
为A
,0xCC8A
为̊
。
所以,为了让你的岛屿正确归档,你需要做这样的事情:
$string = "Åland Islands";
$s = html_entity_decode($string, ENT_QUOTES, 'UTF-8');
$s = Normalizer::normalize($s, Normalizer::FORM_KD);
$s = mb_substr($s, 0, 1);
有可能,您的环境没有安装intl。如果是这种情况,您可以查看urlify(),这是一个将字符串缩减为字母数字部分的函数。
以上你应该可以
注意:请注意,Armenia
,Austria
和Australia
国家/地区都将归档A
。
答案 1 :(得分:1)
循环遍历数组,使用html_entity_decode()解码html实体,然后使用mb_substr()进行拆分。
foreach($array as $values) {
$values['country_name_en'] = html_entity_decode($values['country_name_en']);
$index = mb_substr($values['country_name_en'], 0, 1);
$new_array[$index] = $values;
}
或者你可以使用jlcd建议的功能:
function substr_unicode($str, $s, $l = null) {
return join("", array_slice(
preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l));
}
foreach($array as $values) {
$values['country_name_en'] = html_entity_decode($values['country_name_en']);
$index = substr_unicode($values['country_name_en'], 0, 1);
$new_array[$index] = $values;
}