通过包含html实体的第一个字母拆分数组

时间:2012-06-23 14:09:19

标签: php unicode utf-8 html-entities

我有一个像这样的国家的阵列

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实体作为第一个字符。

任何想法如何做到这一点?

提前致谢

彼得

2 个答案:

答案 0 :(得分:2)

如果您希望在Åland Islands下提交A,则需要比已建议的html_entity_decode()多一点。

intl包含Normalizer::normalize(),一个将Å转换为Å的功能。困惑了吗?该unicode符号(U + 00C5)可以用UTF-8表示为0xC385(组合)和0x41CC8A(分解)。 0x41A0xCC8Å

所以,为了让你的岛屿正确归档,你需要做这样的事情:

$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(),这是一个将字符串缩减为字母数字部分的函数。


以上你应该可以

  1. 循环原始数组
  2. 提取国家/地区名称
  3. 清理国家/地区名称并提取第一个字符
  4. 根据(3)
  5. 的字符构建一个新数组

    注意:请注意,ArmeniaAustriaAustralia国家/地区都将归档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;
}