分享一段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 相关文章推荐
header跳转和include包含问题详解
Sep 08 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
php-fpm配置详解
Feb 12 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
设置php页面编码的两种方法示例介绍
Mar 03 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
PHP ignore_user_abort函数详细介绍和使用实例
Jul 15 PHP
php自定义apk安装包实例
Oct 20 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
Yii框架数据模型的验证规则rules()被执行的方法
Dec 02 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 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 字符串替换的方法
2012/01/10 PHP
php 常用的系统函数
2017/02/07 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
node.js实现端口转发
2016/04/14 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python排序方法实例分析
2015/04/30 Python
Python文件读写常见用法总结
2019/02/22 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
在python里面运用多继承方法详解
2019/07/01 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
正规的求职信范文分享
2013/12/11 职场文书
离职报告格式
2014/11/04 职场文书
拾金不昧表扬信
2015/01/16 职场文书
出国留学自荐信模板
2015/03/06 职场文书
甲午风云观后感
2015/06/02 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书
大学体育课感想
2015/08/10 职场文书
开网店计划分析
2019/07/30 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python