加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP实现的汉字拼音转换和公历农历转换类及使用示例

发布时间:2020-12-12 20:16:41 所属栏目:PHP教程 来源:网络整理
导读:本文整理了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; $ilunarInfo[$year-$this->MIN_YEAR]; $monthArray = $this->getLunarYearMonths($year); $len = count($monthArray); return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]); } function getLunarYearMonths($year){ //debugger; $monthData = $this->getLunarMonths($year); $res=array(); $temp=0; $yearData = $this->lunarInfo[$year-$this->MIN_YEAR]; $len = ($yearData[0]==0?12:13); for($i=0;$i<$len;$i++){ $temp=0; for($j=0;$j<=$i;$j++){ $temp+=$monthData[$j]; } array_push($res,$temp); } return $res; } /** * 获取闰月 * @param year 阴历年份 */ function getLeapMonth($year){ $yearData = $this->lunarInfo[$year-$this->MIN_YEAR]; return $yearData[0]; } /** * 计算阴历日期与正月初一相隔的天数 * @param year * @param month * @param date */ function getDaysBetweenLunar($year,$date){ $yearMonth = $this->getLunarMonths($year); $res=0; for($i=1;$i<$month;$i++){ $res +=$yearMonth[$i-1]; } $res+=$date-1; return $res; } /** * 计算2个阳历日期之间的天数 * @param year 阳历年 * @param cmonth * @param cdate * @param dmonth 阴历正月对应的阳历月份 * @param ddate 阴历初一对应的阳历天数 */ function getDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){ $a = mktime(0,$year); $b = mktime(0,$ddate,$year); return ceil(($a-$b)/24/3600); } /** * 根据距离正月初一的天数计算阴历日期 * @param year 阳历年 * @param between 天数 */ function getLunarByBetween($year,$between){ //debugger; $lunarArray = array(); $yearMonth=array(); $t=0; $e=0; $leapMonth=0; $m=''; if($between==0){ array_push($lunarArray,$year,'初一'); $t = 1; $e = 1; }else{ $year = $between>0? $year : ($year-1); $yearMonth = $this->getLunarYearMonths($year); $leapMonth = $this->getLeapMonth($year); $between = $between>0?$between : ($this->getLunarYearDays($year)+$between); for($i=0;$i<13;$i++){ if($between==$yearMonth[$i]){ $t=$i+2; $e=1; break; }else if($between<$yearMonth[$i]){ $t=$i+1; $e=$between-(empty($yearMonth[$i-1])?0:$yearMonth[$i-1])+1; break; } } $m = ($leapMonth!=0&&$t==$leapMonth+1)?('闰'.$this->getCapitalNum($t- 1,true)):$this->getCapitalNum(($leapMonth!=0&&$leapMonth+1<$t?($t-1):$t),true); $my_year =$this->toYear($year); array_push($lunarArray,$my_year,$m,$this->getCapitalNum($e,false)); } array_push($lunarArray,$this->getLunarYearName($year));// 天干地支 array_push($lunarArray,$t,$e); array_push($lunarArray,$this->getYearZodiac($year));// 12生肖 array_push($lunarArray,$leapMonth);// 闰几月 return $lunarArray; } //转换成中文年份 function toYear($year){ $arr = array("零","一","二","三","四","五","六","七","八","九"); $year_arr = str_split($year); $str = $arr[$year_arr[0]].$arr[$year_arr[1]].$arr[$year_arr[2]].$arr[$year_arr[3]]; return $str; } /** * 获取数字的阴历叫法 * @param num 数字 * @param isMonth 是否是月份的数字 */ function getCapitalNum($num,$isMonth){ $isMonth = $isMonth || false; $dateHash=array('0'=>'','1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六','7'=>'七','8'=>'八','9'=>'九','10'=>'十 '); $monthHash=array('0'=>'','1'=>'正月','2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'冬月','12'=>'腊月'); $res=''; if($isMonth){ $res = $monthHash[$num]; }else{ if($num<=10){ $res = '初'.$dateHash[$num]; }else if($num>10&&$num<20){ $res = '十'.$dateHash[$num-10]; }else if($num==20){ $res = "二十"; }else if($num>20&&$num<30){ $res = "廿".$dateHash[$num-20]; }else if($num==30){ $res = "三十"; } } return $res; } }

?>

以上整理的两个PHP类,可以满足项目基本需求,但是都有一定的缺陷,比如拼音转换可能会遇到生僻字转换不了,公历转农历你会发现2021年后的转换会出问题了,大家有空可以研究下,如果您有更好的实现代码,欢迎分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读