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

blacktiger 发布于1年前 阅读3742次
0 条评论

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

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

需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。