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