PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法


Posted in PHP onMay 03, 2017

本文实例讲述了PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法。分享给大家供大家参考,具体如下:

ICU(International Components for Unicode)里提供了transliterator(直译器),
可以很方便把其他语言(比如简体中文)转为拉丁文表示:
http://cn2.php.net/manual/zh/transliterator.transliterate.php
Transliterator: allows getting latin representation of strings in various languages.

<?php
//文件编码要求是Unicode
header('Content-Type: text/html; charset=utf-8');
echo transliterator_transliterate('Any-Latin', '中华有为');
//输出 zhōng huá yǒu wèi
echo transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', '中华有为');
//输出 zhong hua you wei
echo transliterator_transliterate('Any-Latin; Latin-ASCII; Upper()', '中华有为');
//输出 ZHONG HUA YOU WEI
echo transliterator_transliterate('Any-Latin', '重阳');
//输出 zhòng yáng (错误,多音字还是坑)

苹果上的CFStringTransform/kCFStringTransformToLatin汉字转拼音也是通过ICU transform实现的:

http://userguide.icu-project.org/transforms/general#TOC-ICU-Transliterators
http://nshipster.com/cfstringtransform/

使用php5-intl(依赖ICU:libicu52)的简体中文(zh_CN)排序器collator按拼音排序:

http://cn2.php.net/manual/zh/collator.sort.php
php-src/ext/intl --enable-intl --with-icu-dir=DIR

相关: MySQL数据表排序规则COLLATE=utf8_general_ci

<?php
header('Content-Type: text/html; charset=utf-8');
$coll = collator_create('zh_CN');
$arr = array('中国','华山','华夏','中华','重阳','重量','b','a',2,1);
collator_sort($coll, $arr);
var_export($arr);
/*输出(可见汉字按照拼音排序,但不能识别多音字"重"):
array (
 0 => 'a',
 1 => 'b',
 2 => '华山',
 3 => '华夏',
 4 => '中国',
 5 => '中华',
 6 => '重量',
 7 => '重阳',
 8 => 1,
 9 => 2,
)
*/

如果元素1和2加上引号变成字符串类型的话,则1和2排序后会出现在开头.

查看已经安装的软件包目录文件结构:

dpkg -L libicu52:amd64
/usr/lib/x86_64-linux-gnu/libicu*
/usr/lib/x86_64-linux-gnu/libicudata.so.52.1 动态库23MB
/usr/lib/x86_64-linux-gnu/libicudata.a       静态库23MB

Windows上则是:

php\icu*.dll
php\ext\php_intl.dll

下面实现了常用的按汉字拼音首字母分组排序的功能:

<?php
header('Content-Type: text/html; charset=utf-8');
$arr = array('百度知道','阿里云','百度百科','阿里巴巴');
$coll = collator_create('zh_CN');
collator_sort($coll, $arr);
var_export($arr);
//输出 array ( 0 => '阿里巴巴', 1 => '阿里云', 2 => '百度百科', 3 => '百度知道', )
$tmp = array();
foreach($arr as $v) {
 $pinyin = transliterator_transliterate('Any-Latin; Latin-ASCII; Upper()', $v);
 $tmp[substr($pinyin, 0, 1)][] = $v;
}
var_export($tmp);
/*输出
array (
 'A' =>
 array (
  0 => '阿里巴巴',
  1 => '阿里云',
 ),
 'B' =>
 array (
  0 => '百度百科',
  1 => '百度知道',
 ),
)
*/

附:

ls命令,Linux和Windows的文件管理器,显示如下:

1  2  a  b  华山  华夏  中国  中华  重量  重阳

数字,字母,汉字(按拼音排序,但不能识别多音字)

汉字方面,下面的自然排序跟上面有所不同:

<?php
header('Content-Type: text/plain; charset=utf-8');
$arr = array('中国','华山','华夏','中华','重阳','重量','b','a',2,1);
natsort($arr); // 等价于 uasort($arr, function($a, $b) { return strnatcmp($a, $b); });
var_export($arr);
/*输出(自然排序下汉字并没有按照拼音进行排序):
array (
 9 => 1,
 8 => 2,
 7 => 'a',
 6 => 'b',
 3 => '中华',
 0 => '中国',
 2 => '华夏',
 1 => '华山',
 5 => '重量',
 4 => '重阳',
)
*/

几种排序的比较:

<?php
header('Content-Type: text/plain; charset=utf-8');
$arr = explode(' ', '1 11 111 112 12 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中');
shuffle($arr); //打乱数组
//collator_sort(collator_create('zh_CN'), $arr);
//usort($arr, function($a, $b) { return strnatcmp($a, $b); });
usort($arr, function($a, $b) { return strcmp($a, $b); });
echo implode(' ',$arr);
exit();
?>

ls排序:

1 11 111 112 12 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中

collator_sort(zh_CN)排序(类似Windows/Linux桌面文件管理器里的默认按名称上升排列):

1 11 12 111 112 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中

strnatcmp排序:

1 11 12 111 112 121 122 a aa aaa aab ab aba abb 中 中中 中中中 中中国 中国 中国中 中国国 百度 阿里

strcmp排序:

1 11 111 112 12 121 122 a aa aaa aab ab aba abb 中 中中 中中中 中中国 中国 中国中 中国国 百度 阿里

PHP 相关文章推荐
ftp类(myftp.php)
Oct 09 PHP
PHP获取网卡地址的代码
Apr 09 PHP
PHP 文件类型判断代码
Mar 13 PHP
php设计模式 FlyWeight (享元模式)
Jun 26 PHP
探讨php define()函数及defined()函数使用详解
Jun 09 PHP
php ZipArchive压缩函数详解实例
Nov 06 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
php+mysql大量用户登录解决方案分析
Dec 29 PHP
浅谈php自定义错误日志
Feb 13 PHP
PHP sleep()函数, usleep()函数
Aug 25 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
Feb 20 PHP
PHP实现微信对账单处理
Oct 01 PHP
php中的异常和错误浅析
May 03 #PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 #PHP
利用php-cli和任务计划实现订单同步功能的方法
May 03 #PHP
php删除数组指定元素实现代码
May 03 #PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 #PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 #PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 #PHP
You might like
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
jQuery为DOM动态追加事件的方法
2017/02/16 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
python操作MySQL数据库具体方法
2013/10/28 Python
python中cPickle用法例子分享
2014/01/03 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
马云的职业生涯规划之路
2014/01/01 职场文书
餐厅总厨求职信
2014/03/04 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
厂区绿化方案
2014/05/08 职场文书
植树节口号
2014/06/21 职场文书
党员个人对照检查材料
2014/10/01 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
企业承诺书格式范文
2015/04/28 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python