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 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
六酷社区论坛HOME页清新格调免费版 下载
Mar 07 PHP
php escape URL编码
Dec 10 PHP
php 将excel导入mysql
Nov 09 PHP
php URL验证正则表达式
Jul 19 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
浅析PHP中Collection 类的设计
Jun 21 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 PHP
深入理解php printf() 输出格式化的字符串
May 23 PHP
php文件管理基本功能简单操作
Jan 16 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
php+redis实现商城秒杀功能
Nov 19 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
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
python处理数据,存进hive表的方法
2018/07/04 Python
浅谈Python中的bs4基础
2018/10/21 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
大三学生入党思想汇报
2014/01/02 职场文书
电气个人求职信范文
2014/02/04 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
创卫工作总结2015
2015/04/22 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
python如何获取网络数据
2021/04/11 Python