• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

分享一段PHP制作的中文拼音首字母工具类_PHP

php 搞代码 3年前 (2022-01-25) 26次浏览 已收录 0个评论

代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!!

<br /><?php<br />/**<br />* 汉字拼音首字母工具类<br />*  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123<br />*      中文字符串:返回拼音首字符        eg. 测试字符串 => CSZFC<br />*      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ<br />*  eg.<br />*  $py = new str2PY();<br />*  <br />*  $result = $py->getInitials('周杰伦');<br />*<br />*  //获取首字母<br />*  $result = $py->getFirstString('abc');  //A<br />*  $resutl = $py->getFirstString("周杰伦"); //Z<br />*<br />*/<br />class str2py<br />{<br />    private $_pinyins = array(<br />=> 'A',<br />=> 'B',<br />=> 'C',<br />=> 'D',<br />=> 'E',<br />=> 'F',<br />=> 'G',<br />=> 'H',<br />=> 'J',<br />=> 'K',<br />=> 'L',<br />=> 'M',<br />=> 'N',<br />=> 'O',<br />=> 'P',<br />=> 'Q',<br />=> 'R',<br />=> 'S',<br />=> 'T',<br />=> 'W',<br />=> 'X',<br />=> 'Y',<br />=> 'Z',<br />    );<br />    private $_charset = null;<br />    /**<br />     * 构造函数, 指定需要的编码 default: utf-8<br />     * 支持utf-8, gb2312<br />     *<br />     * @param unknown_type $charset<br />     */<br />    public function __construct($charset = 'utf-8')<br />    {<br />        $this->_charset = $charset;<br />    }<br />    /**<br />     * 中文字符串 substr<br />     *<br />     * @param string $str<br />     * @param int    $start<br />     * @param int    $len<br />     * @return string<br />     */<br />    private function _msubstr($str, $start, $len)<br />    {<br />        $start = $start * 2;<br />        $len = $len * 2;<br />        $strlen = strlen($str);<br />        $result = '';<br />        for ($i = 0; $i < $strlen; $i++)<br />        {<br />            if ($i >= $start && $i < ($start + $len))<br />            {<br />                if (ord(substr($str, $i, 1)) > 129)<br />                {<br />                    $result .= substr($str, $i, 2);<br />                }<br />                else<br />                {<br />                    $result .= substr($str, $i, 1);<br />                }<br />            }<br />            if (ord(substr($str, $i, 1)) > 129)<br />            {<br />                $i++;<br />            }<br />        }<br />        return $result;<br />    }<br />    /**<br />     * 字符串切分为数组 (汉字或者一个字符为单位)<br />     *<br />     * @param string $str<br />     * @return array<br />     */<br />    private function _cutWord($str)<br />    {<br />        $words = array();<br />        while ($str != "")<br />        {<br />            if ($this->_isAscii($str))<br />            {/* 非中文 */<br />                $words[] = $str[0];<br />                $str = substr($str, strlen($str[0]));<br />            }<br />            else<br />            {<br />                $word = $this->_msubstr($str, 0, 1);<br />                $words[] = $word;<br />                $str = substr($str, strlen($word));<br />            }<br />        }<br />        return $words;<br />    }<br />    /**<br />     * 判断字符是否是ascii字符<br />     *<br />     * @param string $char<br />     * @return bool<br />     */<br />    private function _isAscii($char)<br />    {<br />        return ( ord(substr($char, 0, 1)) < 160 );<br />    }<br />    /**<br />     * 判断字符串前3个字符是否是ascii字符<br />     *<span>%本文来源gaodai#ma#com搞*代#码9网#</span><strong>搞gaodaima代码</strong><br />     * @param string $str<br />     * @return bool<br />     */<br />    private function _isAsciis($str)<br />    {<br />        $len = strlen($str) >= 3 ? 3 : 2;<br />        $chars = array();<br />        for ($i = 1; $i < $len - 1; $i++)<br />        {<br />            $chars[] = $this->_isAscii($str[$i]) ? 'yes' : 'no';<br />        }<br />        $result = array_count_values($chars);<br />        if (empty($result['no']))<br />        {<br />            return true;<br />        }<br />        return false;<br />    }<br />    /**<br />     * 获取中文字串的拼音首字符<br />     *<br />     * @param string $str<br />     * @return string<br />     */<br />    public function getInitials($str)<br />    {<br />        if (empty($str))<br />            return '';<br />        if ($this->_isAscii($str[0]) && $this->_isAsciis($str))<br />        {<br />            return $str;<br />        }<br />        $result = array();<br />        if ($this->_charset == 'utf-8')<br />        {<br />            $str = iconv('utf-8', 'gb2312', $str);<br />        }<br />        $words = $this->_cutWord($str);<br />        foreach ($words as $word)<br />        {<br />            if ($this->_isAscii($word))<br />            {/* 非中文 */<br />                $result[] = $word;<br />                continue;<br />            }<br />            $code = ord(substr($word, 0, 1)) * 1000 + ord(substr($word, 1, 1));<br />            /* 获取拼音首字母A--Z */<br />            if (($i = $this->_search($code)) != -1)<br />            {<br />                $result[] = $this->_pinyins[$i];<br />            }<br />        }<br />        return strtoupper(implode('', $result));<br />    }<br />    /**<br />     *  20140624 wangtianbao 获取首字母<br />     *  @param string $str<br />     *  @return string<br />     */<br />    public function getFirstString($str)<br />    {<br />        //先把中文转换成字母<br />        $new_string = $this->getInitials($str);<br />        if (empty($new_string))<br />        {<br />            return '';<br />        }<br />        else<br />        {<br />            return strtoupper(substr($new_string, 0, 1));<br />        }<br />    }<br />    private function _getChar($ascii)<br />    {<br />        if ($ascii >= 48 && $ascii <= 57)<br />        {<br />            return chr($ascii);  /* 数字 */<br />        }<br />        elseif ($ascii >= 65 && $ascii <= 90)<br />        {<br />            return chr($ascii);   /* A--Z */<br />        }<br />        elseif ($ascii >= 97 && $ascii <= 122)<br />        {<br />            return chr($ascii - 32); /* a--z */<br />        }<br />        else<br />        {<br />            return '-'; /* 其他 */<br />        }<br />    }<br />    /**<br />     * 查找需要的汉字内码(gb2312) 对应的拼音字符( 二分法 )<br />     *<br />     * @param int $code<br />     * @return int<br />     */<br />    private function _search($code)<br />    {<br />        $data = array_keys($this->_pinyins);<br />        $lower = 0;<br />        $upper = sizeof($data) - 1;<br />        $middle = (int) round(($lower + $upper) / 2);<br />        if ($code < $data[0])<br />            return -1;<br />        for (;;)<br />        {<br />            if ($lower > $upper)<br />            {<br />                return $data[$lower - 1];<br />            }<br />            $tmp = (int) round(($lower + $upper) / 2);<br />            if (!isset($data[$tmp]))<br />            {<br />                return $data[$middle];<br />            }<br />            else<br />            {<br />                $middle = $tmp;<br />            }<br />            if ($data[$middle] < $code)<br />            {<br />                $lower = (int) $middle + 1;<br />            }<br />            else if ($data[$middle] == $code)<br />            {<br />                return $data[$middle];<br />            }<br />            else<br />            {<br />                $upper = (int) $middle - 1;<br />            }<br />        }<br />    }<br />}<br />

取汉字首字母算是目前几乎没个项目中都需要用到的功能了,这里给大家推荐的是效率比较高的代码,也是在本人项目中使用的,小伙伴们如发现问题,还请留言,大家共同进步


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:分享一段PHP制作的中文拼音首字母工具类_PHP
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址