分享一段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 相关文章推荐
模拟SQLSERVER的两个函数:dateadd(),datediff()
Oct 09 PHP
一周让你学会PHP 不错的学习资料
Feb 06 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
May 25 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
深入PHP FTP类的详解
Jun 13 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
Jun 21 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
PHP实现的下载远程图片自定义函数分享
Jan 28 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
Nov 20 PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
Sep 26 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
php读取xml实例代码
2010/01/28 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
php短网址和数字之间相互转换的方法
2015/03/13 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
PHP文件操作实例总结
2016/09/27 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python构造函数及解构函数介绍
2015/02/26 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
市场营销专科应届生求职信
2013/11/24 职场文书
抄作业检讨书
2014/02/17 职场文书
销售人员职业生涯规划范文
2014/03/01 职场文书
社区工作者感言
2014/03/02 职场文书
产品销售计划书
2014/05/04 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书