分享一段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 相关文章推荐
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
PHP编码规范的深入探讨
Jun 06 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
解析php下载远程图片函数 可伪造来路
Jun 25 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
解析PHP之提取多维数组指定列的方法
Jan 03 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 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者的疑难问答(1)
2006/10/09 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
非常实用的php验证码类
2016/05/15 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
python支付宝支付示例详解
2019/08/22 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
大学生的自我鉴定范文
2014/01/21 职场文书
工作调动申请报告
2015/05/18 职场文书
班主任开场白
2015/06/01 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技