分享一段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 相关文章推荐
phpmyadmin的#1251问题
Nov 25 PHP
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
PHP 函数学习简单小结
Jul 08 PHP
PHP中将网页导出为Word文档的代码
May 25 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
Jun 13 PHP
php的闭包(Closure)匿名函数详解
Feb 22 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
php下载文件,添加响应头的简单实例
Sep 22 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
Sep 08 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
Feb 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
初级的用php写的采集程序
2007/03/16 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
Python实现批量下载文件
2015/05/17 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
Python中的__init__作用是什么
2020/06/09 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
数字漫画:comiXology
2020/06/13 全球购物
上课迟到检讨书
2014/01/19 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
公司节能减排方案
2014/05/16 职场文书
入党推优材料
2014/06/02 职场文书
2014最新实习证明模板
2014/10/02 职场文书
公司欠款证明
2015/06/24 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技
解决IIS7下无法绑定https主机的问题
2022/04/29 Servers