PHP实现的汉字拼音转换和公历农历转换类及使用示例
本文整理了PHP汉字拼音转换和公历农历转换两个功能类文件,非常实用。比如我们查找通讯录可以通过联系人姓名的拼音首字母来查询,可以通过首字母来导航大数据量,可以通过转换拼音来做网站优化等。公农历转化一般用在日历日程安排的项目中,方便农历的节日提醒等等。 1、PHP汉字转拼音Pinyin.class.php类文件可以将大多数汉字转换成汉语拼音,当然也有个别生僻字不能转换,如果你想转换所有的汉字拼音的话,可能需要再配合一个汉字字库来实现,使用该类文件就基本能满足你的项目需求了。用法: 代码如下: strtopin($str);
执行后输出:hao hao xue xi tian tian xiang shang。
如果只是想输出汉字首字母则使用:
代码如下: strtopin($str,1);
执行后输出:hhxxttxs。
Pinyin.class.php 源码: 代码如下: function g($num) { if ($num > 0 && $num < 160) { return chr($num); } elseif ($num < -20319 || $num > -10247) { return ""; } else { for ($i = count($this->d) - 1; $i >= 0; $i--) { if ($this->d[$i][1] <= $num) break; } return $this->d[$i][0]; } } function c($str) { $ret = ""; for ($i = 0; $i < strlen($str); $i++) { $p = ord(substr($str,$i,1)); if ($p > 160) { $q = ord(substr($str,++ $i,1)); $p = $p * 256 + $q -65536; } $ret .= $this->g($p); } $ret = substr($ret,1); return $ret; } function f($str) { $ret = ""; for ($i = 0; $i < strlen($str); $i++) { $p = ord(substr($str,1)); if ($p > 160) { $q = ord(substr($str,1)); $p = $p * 256 + $q -65536; } $ret .= $this->g($p); } return $ret; } /* PHP截取UTF-8编码的中英文字符串 */ function utf8_substr($str,$from,$len) { return preg_replace('#^(?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,' . $from . '}' . '((?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,' . $len . '}).*#s','$1',$str); } /* 将中英文字符串转换成拼音 */ function strtopin($chinese,$type=0) { $i = 0; $pinyin = ""; $arr = array (); while (1) { $str = $this->utf8_substr($chinese,1); if (!empty ($str)) { $arr[$i] = $str; $str = iconv("utf-8","gb2312",$str); if($type==1){ //转换成首字母 $pinyin .= $this->c($str); }else{ //转换成全拼 $pinyin .= $this->f($str)." "; } $i = $i +1; } else break; } return $pinyin; } } ?> 2、PHP公历农历转换公历转农历的算法非常复杂,涉及到农历润月、干支纪年、生肖等。网络上有很多提供的算法,本文整理的一个Lunar.class.php可以实现公农历互转功能。用法: 代码如下: $date = $lunar->convertLunarToSolar(2013,8,17); //公历转农历 print_r($date); 执行后输出数组: <div class="codetitle"><a style="CURSOR: pointer" data="79021" class="copybut" id="copybut79021" onclick="doCopy('code79021')"> 代码如下:<div class="codebody" id="code79021"> Array ( [0] => 二零一三 [1] => 七月 [2] => 十一 [3] => 癸巳 [4] => 7 [5] => 11 [6] => 蛇 [7] => 0 ) 如果要将农历转换成公历则使用: <div class="codetitle"><a style="CURSOR: pointer" data="61267" class="copybut" id="copybut61267" onclick="doCopy('code61267')"> 代码如下:<div class="codebody" id="code61267"> $date = $lunar->convertLunarToSolar(2013,17); //农历转公历 print_r($date); 执行后输出数组: <div class="codetitle"><a style="CURSOR: pointer" data="87970" class="copybut" id="copybut87970" onclick="doCopy('code87970')"> 代码如下:<div class="codebody" id="code87970"> Array ( [0] => 2013 [1] => 09 [2] => 21 ) Lunar.class.php源码: 代码如下: lunarInfo[$year-$this->MIN_YEAR];
if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){
return array(1891,'正月','初一','辛卯','兔');
}
return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$date,$yearData[1],$yearData[2]));
}
function convertSolarMonthToLunar($year,$month) {
$yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){
return array(1891,'兔');
}
$month_days_ary = array(31,31);
$dd = $month_days_ary[$month];
if($this->isLeapYear($year) && $month == 2) $dd++;
$lunar_ary = array();
for ($i = 1; $i < $dd; $i++) {
$array = $this->getLunarByBetween($year,$yearData[2]));
$array[] = $year . '-' . $month . '-' . $i;
$lunar_ary[$i] = $array;
}
return $lunar_ary;
}
/**
* 将阴历转换为阳历
* @param year 阴历-年
* @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0
* @param date 阴历-日
*/
function convertLunarToSolar($year,$date){
$yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
$between = $this->getDaysBetweenLunar($year,$date);
$res = mktime(0,$yearData[2],$year);
$res = date('Y-m-d',$res+$between*24*60*60);
$day = explode('-',$res);
$year = $day[0];
$month= $day[1];
$day = $day[2];
return array($year,$day);
}
/**
* 判断是否是闰年
* @param year
*/
function isLeapYear($year){
return (($year%4==0 && $year%100 !=0) || ($year%400==0));
}
/**
* 获取干支纪年
* @param year
*/
function getLunarYearName($year){
$sky = array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');
$earth = array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');
$year = $year.'';
return $sky[$year{3}].$earth[$year%12];
}
/**
* 根据阴历年获取生肖
* @param year 阴历年
*/
function getYearZodiac($year){
$zodiac = array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');
return $zodiac[$year%12];
}
/**
* 获取阳历月份的天数
* @param year 阳历-年
* @param month 阳历-月
*/
function getSolarMonthDays($year,$month){
$monthHash = array('1'=>31,'2'=>$this->isLeapYear($year)?29:28,'3'=>31,'4'=>30,'5'=>31,'6'=>30,'7'=>31,'8'=>31,'9'=>30,'10'=>31,'11'=>30,'12'=>31);
return $monthHash["$month"];
}
/**
* 获取阴历月份的天数
* @param year 阴历-年
* @param month 阴历-月,从一月开始
*/
function getLunarMonthDays($year,$month){
$monthData = $this->getLunarMonths($year);
return $monthData[$month-1];
}
/**
* 获取阴历每月的天数的数组
* @param year
*/
function getLunarMonths($year){
$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
$leapMonth = $yearData[0];
$bit = decbin($yearData[3]);
for ($i = 0; $i < strlen($bit);$i ++) {
$bitArray[$i] = substr($bit,1);
}
for($k=0,$klen=16-count($bitArray);$k<$klen;$k++){
array_unshift($bitArray,'0');
}
$bitArray = array_slice($bitArray,($leapMonth==0?12:13));
for($i=0; $i ?> 以上整理的两个PHP类,可以满足项目基本需求,但是都有一定的缺陷,比如拼音转换可能会遇到生僻字转换不了,公历转农历你会发现2021年后的转换会出问题了,大家有空可以研究下,如果您有更好的实现代码,欢迎分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |