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类
Jul 15 PHP
黑夜路人出的几道php笔试题
Aug 04 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
Sep 09 PHP
php创建基本身份认证站点的方法详解
Jun 08 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
phpnow php探针环境检测代码
Nov 04 PHP
利用php输出不同的心形图案
Apr 22 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
php自定义扩展名获取函数示例
Dec 12 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
php连接mysql数据库
Mar 21 PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
php 错误处理经验分享
2011/10/11 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
详解参数传递四种形式
2015/07/21 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
医学生自荐信
2013/12/03 职场文书
淘宝好评语大全
2014/05/05 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
长城导游词300字
2015/01/30 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
MySQL约束超详解
2021/09/04 MySQL
python区块链持久化和命令行接口实现简版
2022/05/25 Python
Go语言怎么使用变长参数函数
2022/07/15 Golang