当前位置:首页 > PHP教程 > php类库 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-03 15:17:30 浏览: 评论:0 

这篇文章主要介绍了分享一段PHP制作的中文拼音首字母工具类的代码,非常的实用,推荐给有相同需求的童鞋们。

代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!!代码如下:

  1. <?php 
  2. /** 
  3. * 汉字拼音首字母工具类 
  4. *  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123 
  5. *      中文字符串:返回拼音首字符        eg. 测试字符串 => CSZFC 
  6. *      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ 
  7. *  eg. 
  8. *  $py = new str2PY(); 
  9.  
  10. *  $result = $py->getInitials('周杰伦'); 
  11. * 
  12. *  //获取首字母 
  13. *  $result = $py->getFirstString('abc');  //A 
  14. *  $resutl = $py->getFirstString("周杰伦"); //Z 
  15. * 
  16. */ 
  17. class str2py 
  18.     private $_pinyins = array
  19. => 'A'
  20. => 'B'
  21. => 'C'
  22. => 'D'
  23. => 'E'
  24. => 'F'
  25. => 'G'
  26. => 'H'
  27. => 'J'
  28. => 'K'
  29. => 'L'
  30. => 'M'
  31. => 'N'
  32. => 'O'
  33. => 'P'
  34. => 'Q'
  35. => 'R'
  36. => 'S'
  37. => 'T'
  38. => 'W'
  39. => 'X'
  40. => 'Y'
  41. => 'Z'
  42.     ); 
  43.     private $_charset = null; 
  44.     /** 
  45.      * 构造函数, 指定需要的编码 default: utf-8 
  46.      * 支持utf-8, gb2312 
  47.      * 
  48.      * @param unknown_type $charset 
  49.      */ 
  50.     public function __construct($charset = 'utf-8'
  51.     { 
  52.         $this->_charset = $charset
  53.     } 
  54.     /** 
  55.      * 中文字符串 substr 
  56.      * 
  57.      * @param string $str 
  58.      * @param int    $start 
  59.      * @param int    $len 
  60.      * @return string 
  61.      */ 
  62.     private function _msubstr($str$start$len
  63.     { 
  64.         $start = $start * 2; 
  65.         $len = $len * 2; 
  66.         $strlen = strlen($str); 
  67.         $result = ''
  68.         for ($i = 0; $i < $strlen$i++) 
  69.         { 
  70.             if ($i >= $start && $i < ($start + $len)) 
  71.             { 
  72.                 if (ord(substr($str$i, 1)) > 129) 
  73.                 { 
  74.                     $result .= substr($str$i, 2); 
  75.                 } 
  76.                 else 
  77.                 { 
  78.                     $result .= substr($str$i, 1); 
  79.                 } 
  80.             } 
  81.             if (ord(substr($str$i, 1)) > 129) 
  82.             { 
  83.                 $i++; 
  84.             } 
  85.         } 
  86.         return $result
  87.     } 
  88.     /** 
  89.      * 字符串切分为数组 (汉字或者一个字符为单位) 
  90.      * 
  91.      * @param string $str 
  92.      * @return array 
  93.      */ 
  94.     private function _cutWord($str
  95.     { 
  96.         $words = array(); 
  97.         while ($str != ""
  98.         { 
  99.             if ($this->_isAscii($str)) 
  100.             {/* 非中文 */ 
  101.                 $words[] = $str[0]; 
  102.                 $str = substr($strstrlen($str[0])); 
  103.             } 
  104.             else 
  105.             { 
  106.                 $word = $this->_msubstr($str, 0, 1); 
  107.                 $words[] = $word
  108.                 $str = substr($strstrlen($word)); 
  109.             } 
  110.         } 
  111.         return $words
  112.     } 
  113.     /** 
  114.      * 判断字符是否是ascii字符 
  115.      * 
  116.      * @param string $char 
  117.      * @return bool 
  118.      */ 
  119.     private function _isAscii($char
  120.     { 
  121.         return ( ord(substr($char, 0, 1)) < 160 ); 
  122.     } 
  123.     /** 
  124.      * 判断字符串前3个字符是否是ascii字符 
  125.      * 
  126.      * @param string $str 
  127.      * @return bool 
  128.      */ 
  129.     private function _isAsciis($str
  130.     { 
  131.         $len = strlen($str) >= 3 ? 3 : 2; 
  132.         $chars = array(); 
  133.         for ($i = 1; $i < $len - 1; $i++) 
  134.         { 
  135.             $chars[] = $this->_isAscii($str[$i]) ? 'yes' : 'no'
  136.         } 
  137.         $result = array_count_values($chars); 
  138.         if (emptyempty($result['no'])) 
  139.         { 
  140.             return true; 
  141.         } 
  142.         return false; 
  143.     } 
  144.     /** 
  145.      * 获取中文字串的拼音首字符 
  146.      * 
  147.      * @param string $str 
  148.      * @return string 
  149.      */ 
  150.     public function getInitials($str
  151.     { 
  152.         if (emptyempty($str)) 
  153.             return ''
  154.         if ($this->_isAscii($str[0]) && $this->_isAsciis($str)) 
  155.         { 
  156.             return $str
  157.         } 
  158.         $result = array(); 
  159.         if ($this->_charset == 'utf-8'
  160.         { 
  161.             $str = iconv('utf-8''gb2312'$str); 
  162.         } 
  163.         $words = $this->_cutWord($str); 
  164.         foreach ($words as $word
  165.         { 
  166.             if ($this->_isAscii($word)) 
  167.             {/* 非中文 */ 
  168.                 $result[] = $word
  169.                 continue
  170.             } 
  171.             $code = ord(substr($word, 0, 1)) * 1000 + ord(substr($word, 1, 1)); 
  172.             /* 获取拼音首字母A--Z */ 
  173.             if (($i = $this->_search($code)) != -1) 
  174.             { 
  175.                 $result[] = $this->_pinyins[$i]; 
  176.             } 
  177.         } 
  178.         return strtoupper(implode(''$result)); 
  179.     } 
  180.     /** 
  181.      *  20140624 wangtianbao 获取首字母 
  182.      *  @param string $str 
  183.      *  @return string 
  184.      */ 
  185.     public function getFirstString($str
  186.     { 
  187.         //先把中文转换成字母 
  188.         $new_string = $this->getInitials($str); 
  189.         if (emptyempty($new_string)) 
  190.         { 
  191.             return ''
  192.         } 
  193.         else 
  194.         { 
  195.             return strtoupper(substr($new_string, 0, 1)); 
  196.         } 
  197.     } 
  198.     private function _getChar($ascii
  199.     { 
  200.         if ($ascii >= 48 && $ascii <= 57) 
  201.         { 
  202.             return chr($ascii);  /* 数字 */ 
  203.         } 
  204.         elseif ($ascii >= 65 && $ascii <= 90) 
  205.         { 
  206.             return chr($ascii);   /* A--Z */ 
  207.         } 
  208.         elseif ($ascii >= 97 && $ascii <= 122) 
  209.         { 
  210.             return chr($ascii - 32); /* a--z */ 
  211.         } 
  212.         else 
  213.         { 
  214.             return '-'/* 其他 */ 
  215.         } 
  216.     } 
  217.     /** 
  218.      * 查找需要的汉字内码(gb2312) 对应的拼音字符( 二分法 ) 
  219.      * 
  220.      * @param int $code 
  221.      * @return int 
  222.      */ 
  223.     private function _search($code
  224.     { 
  225.         $data = array_keys($this->_pinyins); 
  226.         $lower = 0; 
  227.         $upper = sizeof($data) - 1; 
  228.         $middle = (int) round(($lower + $upper) / 2); 
  229.         if ($code < $data[0]) 
  230.             return -1; 
  231.         for (;;) 
  232.         { 
  233.             if ($lower > $upper
  234.             { 
  235.                 return $data[$lower - 1]; 
  236.             } 
  237.             $tmp = (int) round(($lower + $upper) / 2); 
  238.             if (!isset($data[$tmp])) 
  239.             { 
  240.                 return $data[$middle]; 
  241.             } 
  242.             else 
  243.             { 
  244.                 $middle = $tmp
  245.             } 
  246.             if ($data[$middle] < $code
  247.             { 
  248.                 $lower = (int) $middle + 1; 
  249.             } 
  250.             else if ($data[$middle] == $code
  251.             { 
  252.                 return $data[$middle]; 
  253.             } 
  254.             else 
  255.             { 
  256.                 $upper = (int) $middle - 1; 
  257.             } 
  258.         } 
  259.     } 

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

Tags: PHP中文拼音工具类

分享到: