在php开发中,经常会遇到根据汉字的首字母拼音排序的问题,该如何解决呢!利用我们php强大的类.
1.引入汉字转换成拼音类Pinyin.class.php
<?php
/**
* 汉字转化为拼音类
*/
class Pinyin {
/**
* 汉字ASCII码库
* @var array
*/
protected $lib;
/**
* 构造函数
* @return void
*/
public function __construct() {
}
/**
* 汉字转化并输出拼音
* @param string $str 所要转化拼音的汉字
* @param boolean $utf8 汉字编码是否为utf8
* @return string
*/
public function output($str, $utf8 = true) {
//参数分析
if (!$str) {
return false;
}
//编码转换.
$str = ($utf8 == true) ? $this->iconvStr('utf-8', 'gbk', $str) : $str;
$num = strlen($str);
$pinyin = '';
for ($i = 0; $i < $num; $i++) {
$temp = ord(substr($str, $i, 1));
if ($temp > 160) {
$temp2 = ord(substr($str, ++$i, 1));
$temp = $temp * 256 + $temp2 - 65536;
}
$pinyin .= $this->num2str($temp);
}
//输出的拼音编码转换.
return ($utf8 == true) ? $this->iconvStr('gbk', 'utf-8', $pinyin) : $pinyin;
}
/**
* 将ASCII编码转化为字符串.
* @param integer $num
* @return string
*/
protected function num2str($num) {
if (!$this->lib) {
$this->parse_lib();
}
if ($num > 0 && $num < 160) {
return chr($num);
} elseif ($num < -20319 || $num > -10247) {
return '';
} else {
$total = sizeof($this->lib) - 1;
for ($i = $total; $i >= 0; $i--) {
if ($this->lib[$i][1] <= $num) {
break;
}
}
return $this->lib[$i][0];
}
}
/**
* 返回汉字编码库
* @return array
*/
protected function parse_lib() {
return $this->lib = array(
array("a", -20319),
array("ai", -20317),
array("an", -20304),
array("ang", -20295),
array("ao", -20292),
array("ba", -20283),
array("bai", -20265),
array("ban", -20257),
array("bang", -20242),
array("bao", -20230),
array("bei", -20051),
array("ben", -20036),
array("beng", -20032),
array("bi", -20026),
array("bian", -20002),
array("biao", -19990),
array("bie", -19986),
array("bin", -19982),
array("bing", -19976),
array("bo", -19805),
array("bu", -19784),
array("ca", -19775),
array("cai", -19774),
array("can", -19763),
array("cang", -19756),
array("cao", -19751),
array("ce", -19746),
array("ceng", -19741),
array("cha", -19739),
array("chai", -19728),
array("chan", -19725),
array("chang", -19715),
array("chao", -19540),
array("che", -19531),
array("chen", -19525),
array("cheng", -19515),
array("chi", -19500),
array("chong", -19484),
array("chou", -19479),
array("chu", -19467),