分享一段PHP制作的中文拼音首字母工具类


Posted in PHP onDecember 11, 2014

代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!!

<?php

/**

* 汉字拼音首字母工具类

*  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123

*      中文字符串:返回拼音首字符        eg. 测试字符串 => CSZFC

*      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ

*  eg.

*  $py = new str2PY();

*  

*  $result = $py->getInitials('周杰伦');

*

*  //获取首字母

*  $result = $py->getFirstString('abc');  //A

*  $resutl = $py->getFirstString("周杰伦"); //Z

*

*/

class str2py

{

    private $_pinyins = array(

=> 'A',

=> 'B',

=> 'C',

=> 'D',

=> 'E',

=> 'F',

=> 'G',

=> 'H',

=> 'J',

=> 'K',

=> 'L',

=> 'M',

=> 'N',

=> 'O',

=> 'P',

=> 'Q',

=> 'R',

=> 'S',

=> 'T',

=> 'W',

=> 'X',

=> 'Y',

=> '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));

    }

    /**

     *  20140624 wangtianbao 获取首字母

     *  @param string $str

     *  @return string

     */

    public function getFirstString($str)

    {

        //先把中文转换成字母

        $new_string = $this->getInitials($str);

        if (empty($new_string))

        {

            return '';

        }

        else

        {

            return strtoupper(substr($new_string, 0, 1));

        }

    }

    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执行速度全攻略(下)
Oct 09 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
php中inlcude()性能对比详解
Sep 16 PHP
学习php分页代码实例
Oct 24 PHP
php命令行使用方法和命令行参数说明
Apr 08 PHP
php中创建和调用webservice接口示例
Jul 25 PHP
PHP中调用SVN命令更新网站方法
Jan 07 PHP
WordPress的主题编写中获取头部模板和底部模板
Dec 28 PHP
PHP自定义多进制的方法
Nov 03 PHP
php中pcntl_fork创建子进程的方法实例
Mar 14 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 PHP
PHP截取指定图片大小的方法
Dec 10 #PHP
php实现图片添加描边字和马赛克的方法
Dec 10 #PHP
PHP生成条形图的方法
Dec 10 #PHP
php自定文件保存session的方法
Dec 10 #PHP
php通过session防url攻击方法
Dec 10 #PHP
php利用cookies实现购物车的方法
Dec 10 #PHP
php针对cookie操作的队列操作类实例
Dec 10 #PHP
You might like
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
PHP编写RESTful接口
2016/02/23 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
python实现马耳可夫链算法实例分析
2015/05/20 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
详解python中eval函数的作用
2019/10/22 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
keras输出预测值和真实值方式
2020/06/27 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
Python3.9新特性详解
2020/10/10 Python
python中K-means算法基础知识点
2021/01/25 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
幼儿园毕业教师感言
2014/02/21 职场文书
青年文明号创建承诺
2014/03/31 职场文书
大学生个人求职信例文
2014/07/07 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技