常用php函数,来自互联网

举报
小雨青年 发表于 2022/03/29 01:23:58 2022/03/29
【摘要】 function getFirstCharter($str){ if(empty($str)){return '';} $fchar=ord($str{0}); if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{...

  
  1. function getFirstCharter($str){
  2. if(empty($str)){return '';}
  3. $fchar=ord($str{0});
  4. if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0});
  5. $s1=iconv('UTF-8','gb2312',$str);
  6. $s2=iconv('gb2312','UTF-8',$s1);
  7. $s=$s2==$str?$s1:$str;
  8. $asc=ord($s{0})*256+ord($s{1})-65536;
  9. if($asc>=-20319&&$asc<=-20284) return 'A';
  10. if($asc>=-20283&&$asc<=-19776) return 'B';
  11. if($asc>=-19775&&$asc<=-19219) return 'C';
  12. if($asc>=-19218&&$asc<=-18711) return 'D';
  13. if($asc>=-18710&&$asc<=-18527) return 'E';
  14. if($asc>=-18526&&$asc<=-18240) return 'F';
  15. if($asc>=-18239&&$asc<=-17923) return 'G';
  16. if($asc>=-17922&&$asc<=-17418) return 'H';
  17. if($asc>=-17417&&$asc<=-16475) return 'J';
  18. if($asc>=-16474&&$asc<=-16213) return 'K';
  19. if($asc>=-16212&&$asc<=-15641) return 'L';
  20. if($asc>=-15640&&$asc<=-15166) return 'M';
  21. if($asc>=-15165&&$asc<=-14923) return 'N';
  22. if($asc>=-14922&&$asc<=-14915) return 'O';
  23. if($asc>=-14914&&$asc<=-14631) return 'P';
  24. if($asc>=-14630&&$asc<=-14150) return 'Q';
  25. if($asc>=-14149&&$asc<=-14091) return 'R';
  26. if($asc>=-14090&&$asc<=-13319) return 'S';
  27. if($asc>=-13318&&$asc<=-12839) return 'T';
  28. if($asc>=-12838&&$asc<=-12557) return 'W';
  29. if($asc>=-12556&&$asc<=-11848) return 'X';
  30. if($asc>=-11847&&$asc<=-11056) return 'Y';
  31. if($asc>=-11055&&$asc<=-10247) return 'Z';
  32. return null;
  33. }
  34. 公司同事整理的类,挺实用的.相信拿出来分享下他不会介意的O(∩_∩)O.不过如果首字母是数字或英文会有些问题.
  35. /**
  36. * Helper_Spell 汉字拼音首字母工具类
  37. *
  38. * @category Helper
  39. * @package Helper_Spell
  40. * @author Lancer <lancer.he@gmail.com>
  41. * @version 1.0
  42. * @see Translation_Big2gb
  43. */
  44. class Helper_Spell {
  45. /**
  46. * $_pinyins
  47. * @var array
  48. * @access private
  49. */
  50. private $_pinyins = array(
  51. 176161 => 'A',
  52. 176197 => 'B',
  53. 178193 => 'C',
  54. 180238 => 'D',
  55. 182234 => 'E',
  56. 183162 => 'F',
  57. 184193 => 'G',
  58. 185254 => 'H',
  59. 187247 => 'J',
  60. 191166 => 'K',
  61. 192172 => 'L',
  62. 194232 => 'M',
  63. 196195 => 'N',
  64. 197182 => 'O',
  65. 197190 => 'P',
  66. 198218 => 'Q',
  67. 200187 => 'R',
  68. 200246 => 'S',
  69. 203250 => 'T',
  70. 205218 => 'W',
  71. 206244 => 'X',
  72. 209185 => 'Y',
  73. 212209 => 'Z',
  74. 215249 => 'Z',
  75. );
  76. /**
  77. * $_charset
  78. * @var string
  79. * @access private
  80. */
  81. private $_charset = null;
  82. /**
  83. * __construct 构造函数, 指定需要的编码 default: utf-8 支持utf-8, gb2312
  84. *
  85. * @param unknown_type $charset
  86. */
  87. public function __construct( $charset = 'utf-8' ) {
  88. $this->_charset = $charset;
  89. }
  90. /**
  91. * getInitialsFirst 返回首个汉字的拼音
  92. *
  93. * @access public
  94. * @static
  95. * @param string $str
  96. * @return string
  97. * @example Helper_Spell::getInitialsFirst('我的爱'); => w
  98. */
  99. public static function getInitialsFirst( $str, $charset = 'utf-8' ) {
  100. $chars = array(
  101. 'A','B','C','D','E','F',
  102. 'G','H','I','J','K','L',
  103. 'M','N','O','P','Q','R',
  104. 'S','T','U','V','W','X',
  105. 'Y','Z');
  106. $string = self::getInitials( $str );
  107. $length = strlen($string);
  108. for($i=0; $i < $length; $i++) {
  109. if ( in_array( $string{$i}, $chars ) ) {
  110. return $string{$i};
  111. }
  112. }
  113. return '*';
  114. }
  115. /**
  116. * getInitials 返回拼音组合
  117. *
  118. * @access public
  119. * @static
  120. * @param string $str
  121. * @return string
  122. * @example Helper_Spell::getInitials('我的爱'); => wda
  123. */
  124. public static function getInitials( $str, $charset = 'utf-8' ) {
  125. $instance = new Helper_Spell( $charset );
  126. return $instance->_getInitials( $str );
  127. }
  128. /**
  129. * _getInitials 获取中文字串的拼音首字符
  130. * 注:英文的字串:不变返回(包括数字) eg .abc123 => abc123
  131. * 中文字符串:返回拼音首字符 eg. 王小明 => WXM
  132. * 中英混合串: 返回拼音首字符和英文 eg. 我i我j => WIWJ
  133. *
  134. * @access private
  135. * @param string $str
  136. * @return string
  137. */
  138. private function _getInitials( $str, $translation=TRUE ){
  139. if ( empty($str) ) return '';
  140. if ( $this->_isAscii($str[0]) && $this->_isAsciis( $str ))
  141. return $str;
  142. if ( $translation )
  143. $str = Translation_Big2gb::big2gb( $str );
  144. $result = array();
  145. if ( $this->_charset == 'utf-8' ){
  146. //IGNORE很重要,加上这个就可以是ICONV()函数忽略错误,继续执行
  147. $str = iconv( 'utf-8', 'gbk//IGNORE', $str );
  148. }
  149. $words = $this->_cutWord( $str );
  150. foreach ( $words AS $word ) {
  151. if ( $this->_isAscii($word) ) {//非中文
  152. $result[] = $word;
  153. continue;
  154. }
  155. $code = ( ord(substr($word,0,1)) ) * 1000 + (ord(substr($word,1,1)));
  156. //获取拼音首字母A--Z
  157. if ( ($i = $this->_search($code)) != -1 ){
  158. $result[] = $this->_pinyins[$i];
  159. }
  160. }
  161. return strtoupper(implode('', $result));
  162. }
  163. /**
  164. * _msubstr 获取中文字符串
  165. *
  166. * @access private
  167. * @param string $str
  168. * @param int $start
  169. * @param int $len
  170. * @return string
  171. */
  172. private function _msubstr ($str, $start, $len) {
  173. $start = $start * 2;
  174. $len = $len * 2;
  175. $strlen = strlen($str);
  176. $result = '';
  177. for ( $i = 0; $i < $strlen; $i++ ) {
  178. if ( $i >= $start && $i < ($start + $len) ) {
  179. if ( ord(substr($str, $i, 1)) > 129 ) $result .= substr($str, $i, 2);
  180. else $result .= substr($str, $i, 1);
  181. }
  182. if ( ord(substr($str, $i, 1)) > 129 ) $i++;
  183. }
  184. return $result;
  185. }
  186. /**
  187. * _cutWord 字符串切分为数组 (汉字或者一个字符为单位)
  188. *
  189. * @access private
  190. * @param string $str
  191. * @return array
  192. */
  193. private function _cutWord( $str ) {
  194. $words = array();
  195. while ( $str != "" ) {
  196. if ( $this->_isAscii($str) ) {//非中文
  197. $words[] = $str[0];
  198. $str = substr( $str, strlen($str[0]) );
  199. } else {
  200. $word = $this->_msubstr( $str, 0, 1 );
  201. $words[] = $word;
  202. $str = substr( $str, strlen($word) );
  203. }
  204. }
  205. return $words;
  206. }
  207. /**
  208. * _isAscii 判断字符是否是ascii字符
  209. *
  210. * @access private
  211. * @param string $char
  212. * @return bool
  213. */
  214. private function _isAscii( $char ) {
  215. return ( ord( substr($char,0,1) ) < 160 );
  216. }
  217. /**
  218. * _isAsciis 判断字符串前3个字符是否是ascii字符
  219. *
  220. * @access private
  221. * @param string $str
  222. * @return bool
  223. */
  224. private function _isAsciis( $str ) {
  225. $len = strlen($str) >= 3 ? 3: 2;
  226. $chars = array();
  227. for( $i = 1; $i < $len -1; $i++ ){
  228. $chars[] = $this->_isAscii( $str[$i] ) ? 'yes':'no';
  229. }
  230. $result = array_count_values( $chars );
  231. if ( empty($result['no']) ){
  232. return true;
  233. }
  234. return false;
  235. }
  236. /**
  237. * _getChar 通过ASC码返回字母或者数字
  238. *
  239. * @access private
  240. * @param string $ascii
  241. * @return string
  242. */
  243. private function _getChar( $ascii ){
  244. if ( $ascii >= 48 && $ascii <= 57 ) {
  245. return chr($ascii); //数字
  246. } elseif ( $ascii>=65 && $ascii<=90 ) {
  247. return chr($ascii); // A--Z
  248. } elseif ($ascii>=97 && $ascii<=122 ) {
  249. return chr($ascii-32); // a--z
  250. } else {
  251. return '~'; //其他
  252. }
  253. }
  254. /**
  255. * _search 查找需要的汉字内码(gb2312) 对应的拼音字符(二分法)
  256. *
  257. * @access private
  258. * @param int $code
  259. * @return int
  260. */
  261. private function _search( $code ) {
  262. $data = array_keys($this->_pinyins);
  263. $lower = 0;
  264. $upper = sizeof($data)-1;
  265. // 排除非一级汉字
  266. if ($code < $data[0] || $code > $data[23]) return -1;
  267. for (;;) {
  268. if ( $lower > $upper ){
  269. return $data[$lower-1];
  270. }
  271. $middle = (int) round(($lower + $upper) / 2);
  272. if ( !isset($data[$middle]) ) {
  273. return -1;
  274. }
  275. if ( $data[$middle] < $code ){
  276. $lower = (int)$middle + 1;
  277. } else if ( $data[$middle] == $code ) {
  278. return $data[$middle];
  279. } else {
  280. $upper = (int)$middle - 1;
  281. }
  282. }// end for
  283. }
  284. }

文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。

原文链接:coderfix.blog.csdn.net/article/details/17239669

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。