分享一段PHP制作的中文拼音首字母工具类
这篇文章主要介绍了分享一段PHP制作的中文拼音首字母工具类的代码,非常的实用,推荐给有相同需求的童鞋们。
代码很简单,这里就不多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 (emptyempty($result['no']))
- {
- return true;
- }
- return false;
- }
- /**
- * 获取中文字串的拼音首字符
- *
- * @param string $str
- * @return string
- */
- public function getInitials($str)
- {
- if (emptyempty($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 (emptyempty($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;
- }
- }
- }
- }
取汉字首字母算是目前几乎没个项目中都需要用到的功能了,这里给大家推荐的是效率比较高的代码,也是在本人项目中使用的,小伙伴们如发现问题,还请留言,大家共同进步。