分享一段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 相关文章推荐
ADODB的数据库封包程序库
Dec 31 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
PHP以及MYSQL日期比较方法
Nov 29 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
PHP取二进制文件头快速判断文件类型的实现代码
Aug 05 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
php字符串的替换,分割和连接方法
May 23 PHP
PHP实现生成推广海报的方法详解
Mar 14 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 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语法(5)
2006/10/09 PHP
微信公众平台天气预报功能开发
2014/07/06 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
详解详解Python中writelines()方法的使用
2015/05/25 Python
python基础之入门必看操作
2017/07/26 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
python实现泊松图像融合
2018/07/26 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
Python流程控制语句的深入讲解
2020/06/15 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
python切割图片的示例
2020/11/12 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
英语翻译系毕业生求职信
2013/09/29 职场文书
岗位职责怎么写
2014/03/14 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
搞笑爱情保证书
2014/04/29 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书