分享一段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 getsiteurl()函数
Sep 05 PHP
封装一个PDO数据库操作类代码
Sep 09 PHP
整理的9个实用的PHP库简介和下载
Nov 09 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 PHP
PHP抓取及分析网页的方法详解
Apr 26 PHP
PHP发送AT指令实例代码
May 26 PHP
CI框架表单验证实例详解
Nov 21 PHP
关于PHP通用返回值设置方法
Mar 31 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 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入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
JS实现滑动导航效果
2020/01/14 Javascript
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
详解python之协程gevent模块
2018/06/14 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
存储过程的优点有哪些
2012/09/27 面试题
局火灾防控工作方案
2014/05/25 职场文书
意向协议书
2015/01/27 职场文书
公司市场部岗位职责
2015/04/15 职场文书
学生会任命书范本
2015/09/21 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
如何在Python中妥善使用进度条详解
2022/04/05 Python