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写MySQL数据 实现代码
Jun 15 PHP
php 常用类整理
Dec 23 PHP
php写的带缓存数据功能的mysqli类
Sep 06 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
php jsonp单引号转义
Nov 23 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
PHP实现递归无限级分类
Oct 22 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
PHP中类与对象功能、用法实例解读
Mar 27 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
zend framework重定向方法小结
2016/05/28 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
在python中pandas的series合并方法
2018/11/12 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
2019/08/23 Python
flask 实现token机制的示例代码
2019/11/07 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
python网络编程之五子棋游戏
2020/05/14 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
个人作风剖析材料
2014/02/02 职场文书
投资意向书范本
2014/04/01 职场文书
摄影展策划方案
2014/06/02 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
大学生,三分钟即兴演讲稿
2019/07/22 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript