加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 02:15:56 所属栏目:PHP教程 来源:网络整理
导读:《PHP实战:分享一段PHP制作的中文拼音首字母工具类》要点: 本文介绍了PHP实战:分享一段PHP制作的中文拼音首字母工具类,希望对您有用。如果有疑问,可以联系我们。 代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!! PHP编程 代

《PHP实战:分享一段PHP制作的中文拼音首字母工具类》要点:
本文介绍了PHP实战:分享一段PHP制作的中文拼音首字母工具类,希望对您有用。如果有疑问,可以联系我们。

代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!!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,2);
??????????????? }
??????????????? else
??????????????? {
??????????????????? $result .= substr($str,1);
??????????????? }
??????????? }
??????????? if (ord(substr($str,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,1);
??????????????? $words[] = $word;
??????????????? $str = substr($str,strlen($word));
??????????? }
??????? }
??????? return $words;
??? }
??? /**
???? * 判断字符是否是ascii字符
???? *
???? * @param string $char
???? * @return bool
???? */
??? private function _isAscii($char)
??? {
??????? return ( ord(substr($char,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,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,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编程

欢迎参与《PHP实战:分享一段PHP制作的中文拼音首字母工具类》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读