在线报名系统开发 php+mysql程序开发

手机号码:18018290177 QQ:2373311510 旺旺:xxw365
当前位置:首页 > 程序详细介绍

php获取姓名拼音首字母

发布时间:2018-12-18 浏览次数:

<?php
/**
 * created by wangbinandi@gmail.com at 2008-12-29 21:12
 * 汉字拼音首字母工具类
 *  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123
 *      中文字符串:返回拼音首字符        eg. 王小明 => WXM
 *      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ
 *  eg.
 *  $py = new PYInitials();
 *  $result = $py->getInitials('王小明');
 */
class PYInitials
{
 private $_pinyins = array(
  176161 => 'A',
  176197 => 'B',
  178193 => 'C',
  180238 => 'D',
  182234 => 'E',
  183162 => 'F',
  184193 => 'G',
  185254 => 'H',
  187247 => 'J',
  191166 => 'K',
  192172 => 'L',
  194232 => 'M',
  196195 => 'N',
  197182 => 'O',
  197190 => 'P',
  198218 => 'Q',
  200187 => 'R',
  200246 => 'S',
  203250 => 'T',
  205218 => 'W',
  206244 => 'X',
  209185 => 'Y',
  212209 => '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, $i, 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));
 }
 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);
  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;
   }
  }// end for
 }
}
?>