分享一段PHP制作的中文拼音首字母工具类_php教程-查字典教程网
分享一段PHP制作的中文拼音首字母工具类
分享一段PHP制作的中文拼音首字母工具类
发布时间:2016-12-29 来源:查字典编辑
摘要:代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!!复制代码代码如下:abc123*中文字符串:返回拼音首字...

代码很简单,这里就不多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 (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, 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 (empty($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;

}

}

}

}

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

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新php教程学习
    热门php教程学习
    编程开发子分类