分享一段PHP制作的中文拼音首字母工具类
代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!!
<?php /** *汉字拼音首字母工具类 * 注:英文的字串:不变返回(包括数字) eg.abc123=>abc123 * 中文字符串:返回拼音首字符 eg.测试字符串=>CSZFC * 中英混合串:返回拼音首字符和英文 eg.我i我j=>WIWJ * eg. * $py=newstr2PY(); * * $result=$py->getInitials('周杰伦'); * * //获取首字母 * $result=$py->getFirstString('abc'); //A * $resutl=$py->getFirstString("周杰伦");//Z * */ classstr2py { 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 * *@paramunknown_type$charset */ publicfunction__construct($charset='utf-8') { $this->_charset=$charset; } /** *中文字符串substr * *@paramstring$str *@paramint $start *@paramint $len *@returnstring */ privatefunction_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; } /** *字符串切分为数组(汉字或者一个字符为单位) * *@paramstring$str *@returnarray */ privatefunction_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字符 * *@paramstring$char *@returnbool */ privatefunction_isAscii($char) { return(ord(substr($char,0,1))<160); } /** *判断字符串前3个字符是否是ascii字符 * *@paramstring$str *@returnbool */ privatefunction_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'])) { returntrue; } returnfalse; } /** *获取中文字串的拼音首字符 * *@paramstring$str *@returnstring */ publicfunctiongetInitials($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($wordsas$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]; } } returnstrtoupper(implode('',$result)); } /** * 20140624wangtianbao获取首字母 * @paramstring$str * @returnstring */ publicfunctiongetFirstString($str) { //先把中文转换成字母 $new_string=$this->getInitials($str); if(empty($new_string)) { return''; } else { returnstrtoupper(substr($new_string,0,1)); } } privatefunction_getChar($ascii) { if($ascii>=48&&$ascii<=57) { returnchr($ascii); /*数字*/ } elseif($ascii>=65&&$ascii<=90) { returnchr($ascii); /*A--Z*/ } elseif($ascii>=97&&$ascii<=122) { returnchr($ascii-32);/*a--z*/ } else { return'-';/*其他*/ } } /** *查找需要的汉字内码(gb2312)对应的拼音字符(二分法) * *@paramint$code *@returnint */ privatefunction_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; } elseif($data[$middle]==$code) { return$data[$middle]; } else { $upper=(int)$middle-1; } } } }
取汉字首字母算是目前几乎没个项目中都需要用到的功能了,这里给大家推荐的是效率比较高的代码,也是在本人项目中使用的,小伙伴们如发现问题,还请留言,大家共同进步