php获取汉字首字母的函数


Posted in PHP onNovember 07, 2013

网上的方法有不少,都是一样的原理,按照需求,做了一下版本的class类文件,主要功能是:功能明确,易于修改维护和扩展; 英文的字串:不变返回(包括数字);中文字符串:返回拼音首字符; 中英混合串: 返回拼音首字符和英文。该算法采用了二分法查找,修复了之前字母Z读取成Y的错误。好东西要收藏,故在此留下印记,以供后人考证!

<?php 
 /**
* Modified by http://iulog.com @ 2013-05-07
* 修复二分法查找方法
* 汉字拼音首字母工具类
*  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123
*      中文字符串:返回拼音首字符        eg. 测试字符串 => CSZFC
*      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ
*  eg.
*  $py = new str2PY();
*  $result = $py->getInitials('啊吧才的饿飞就好i就看了吗你哦平去人是他uv我想一在');
*/
class str2PY
{
    private $_pinyins = array(
        176161 => 'A',
        176197 => 'B',
        178193 => 'C',
        180238 => 'D',
        182234 => 'E',
        183162 => 'F',
        184193 => 'G',
        185254 => 'H',
        187247 => 'J',
        191166 => 'K',
        192172 => 'L',
        194232 => 'M',
        196195 => 'N',
        197182 => 'O',
        197190 => 'P',
        198218 => 'Q',
        200187 => 'R',
        200246 => 'S',
        203250 => 'T',
        205218 => 'W',
        206244 => 'X',
        209185 => 'Y',
        212209 => 'Z',
    );
    private $_charset = null;
    /**
     * 构造函数, 指定需要的编码 default: utf-8
     * 支持utf-8, gb2312
     *
     * @param unknown_type $charset
     */
    public function __construct( $charset = 'utf-8' )
    {
        $this->_charset    = $charset;
    }
    /**
     * 中文字符串 substr
     *
     * @param string $str
     * @param int    $start
     * @param int    $len
     * @return string
     */
    private function _msubstr ($str, $start, $len)
    {
        $start  = $start * 2;
        $len    = $len * 2;
        $strlen = strlen($str);
        $result = '';
        for ( $i = 0; $i < $strlen; $i++ ) {
            if ( $i >= $start && $i < ($start + $len) ) {
                if ( ord(substr($str, $i, 1)) > 129 ) $result .= substr($str, $i, 2);
                else $result .= substr($str, $i, 1);
            }
            if ( ord(substr($str, $i, 1)) > 129 ) $i++;
        }
        return $result;
    }
    /**
     * 字符串切分为数组 (汉字或者一个字符为单位)
     *
     * @param string $str
     * @return array
     */
    private function _cutWord( $str )
    {
        $words = array();
         while ( $str != "" )
         {
            if ( $this->_isAscii($str) ) {/*非中文*/
                $words[] = $str[0];
                $str = substr( $str, strlen($str[0]) );
            }else{
                $word = $this->_msubstr( $str, 0, 1 );
                $words[] = $word;
                $str = substr( $str, strlen($word) );
            }
         }
         return $words;
    }
    /**
     * 判断字符是否是ascii字符
     *
     * @param string $char
     * @return bool
     */
    private function _isAscii( $char )
    {
        return ( ord( substr($char,0,1) ) < 160 );
    }
    /**
     * 判断字符串前3个字符是否是ascii字符
     *
     * @param string $str
     * @return bool
     */
    private function _isAsciis( $str )
    {
        $len = strlen($str) >= 3 ? 3: 2;
        $chars = array();
        for( $i = 1; $i < $len -1; $i++ ){
            $chars[] = $this->_isAscii( $str[$i] ) ? 'yes':'no';
        }
        $result = array_count_values( $chars );
        if ( empty($result['no']) ){
            return true;
        }
        return false;
    }
    /**
     * 获取中文字串的拼音首字符
     *
     * @param string $str
     * @return string
     */
    public function getInitials( $str )
    {
        if ( empty($str) ) return '';
        if ( $this->_isAscii($str[0]) && $this->_isAsciis( $str )){
            return $str;
        }
        $result = array();
        if ( $this->_charset == 'utf-8' ){
            $str = iconv( 'utf-8', 'gb2312', $str );
        }
        $words = $this->_cutWord( $str );
        foreach ( $words as $word )
        {
            if ( $this->_isAscii($word) ) {/*非中文*/
                $result[] = $word;
                continue;
            }
            $code = ord( substr($word,0,1) ) * 1000 + ord( substr($word,1,1) );
            /*获取拼音首字母A--Z*/
            if ( ($i = $this->_search($code)) != -1 ){
                $result[] = $this->_pinyins[$i];
            }
        }
        return strtoupper(implode('',$result));
    }
    private function _getChar( $ascii )
    {
        if ( $ascii >= 48 && $ascii <= 57){
            return chr($ascii);  /*数字*/
        }elseif ( $ascii>=65 && $ascii<=90 ){
            return chr($ascii);   /* A--Z*/
        }elseif ($ascii>=97 && $ascii<=122){
            return chr($ascii-32); /* a--z*/
        }else{
            return '-'; /*其他*/
        }
    }
    /**
     * 查找需要的汉字内码(gb2312) 对应的拼音字符( 二分法 )
     *
     * @param int $code
     * @return int
     */
    private function _search( $code )
    {
        $data = array_keys($this->_pinyins);
        $lower = 0;
        $upper = sizeof($data)-1;
  $middle = (int) round(($lower + $upper) / 2);
        if ( $code < $data[0] ) return -1;
        for (;;) {
            if ( $lower > $upper ){
                return $data[$lower-1];
            }
            $tmp = (int) round(($lower + $upper) / 2);
            if ( !isset($data[$tmp]) ){
    return $data[$middle];
            }else{ 
    $middle = $tmp;
   }
            if ( $data[$middle] < $code ){
                $lower = (int)$middle + 1;
            }else if ( $data[$middle] == $code ) {
                return $data[$middle];
            }else{
                $upper = (int)$middle - 1;
            }
        }
    }
}
?>
PHP 相关文章推荐
PHP 文件扩展名 获取函数
Jun 03 PHP
php中定时计划任务的实现原理
Jan 08 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php单例模式实现方法分析
Mar 14 PHP
初识PHP中的Swoole
Apr 05 PHP
php项目开发中用到的快速排序算法分析
Jun 25 PHP
Yii2实现上下联动下拉框功能的方法
Aug 10 PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
php编程实现简单的网页版计算器功能示例
Apr 26 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 #PHP
php cookie使用方法学习笔记分享
Nov 07 #PHP
PHP 5.5 创建和验证哈希最简单的方法详解
Nov 07 #PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
Nov 07 #PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 #PHP
php去除HTML标签实例
Nov 06 #PHP
php实现监听事件
Nov 06 #PHP
You might like
php实现用户在线时间统计详解
2011/10/08 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
php数组使用规则分析
2015/02/27 PHP
php生成图片缩略图的方法
2015/04/07 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
react-native封装插件swiper的使用方法
2018/03/20 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
python实现简单遗传算法
2018/03/19 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
python推导式的使用方法实例
2021/02/28 Python
中国最大的名表商城:万表网
2016/08/29 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
jQuery treeview树形结构应用
2021/03/24 jQuery
现场活动策划方案
2014/08/22 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏