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

yellowsnake 发布于1年前 阅读4015次
0 条评论

本文整理了PHP汉字拼音转换和公历农历转换两个功能类文件,非常实用。比如我们查找通讯录可以通过联系人姓名的拼音首字母来查询,可以通过首字母来导航大数据量,可以通过转换拼音来做网站优化等。公农历转化一般用在日历日程安排的项目中,方便农历的节日提醒等等。

1、PHP汉字转拼音

Pinyin.class.php类文件可以将大多数汉字转换成汉语拼音,当然也有个别生僻字不能转换,如果你想转换所有的汉字拼音的话,可能需要再配合一个汉字字库来实现,使用该类文件就基本能满足你的项目需求了。用法:

 require_once("Pinyin.class.php"); 
 $pinyin = new Pinyin(); 
 $str = '好好学习天天向上'; 
 echo $pinyin->strtopin($str);

执行后输出:hao hao xue xi tian tian xiang shang。
如果只是想输出汉字首字母则使用:
 echo $pinyin->strtopin($str,1);

执行后输出:hhxxttxs。

Pinyin.class.php 源码:

 <?php 
 class Pinyin{ 
  private $d = 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 
   ), 
   array ( 
    "chuai", 
    -19289 
   ), 
   array ( 
    "chuan", 
    -19288 
   ), 
   array ( 
    "chuang", 
    -19281 
   ), 
   array ( 
    "chui", 
    -19275 
   ), 
   array ( 
    "chun", 
    -19270 
   ), 
   array ( 
    "chuo", 
    -19263 
   ), 
   array ( 
    "ci", 
    -19261 
   ), 
   array ( 
    "cong", 
    -19249 
   ), 
   array ( 
    "cou", 
    -19243 
   ), 
   array ( 
    "cu", 
    -19242 
   ), 
   array ( 
    "cuan", 
    -19238 
   ), 
   array ( 
    "cui", 
    -19235 
   ), 
   array ( 
    "cun", 
    -19227 
   ), 
   array ( 
    "cuo", 
    -19224 
   ), 
   array ( 
    "da", 
    -19218 
   ), 
   array ( 
    "dai", 
    -19212 
   ), 
   array ( 
    "dan", 
    -19038 
   ), 
   array ( 
    "dang", 
    -19023 
   ), 
   array ( 
    "dao", 
    -19018 
   ), 
   array ( 
    "de", 
    -19006 
   ), 
   array ( 
    "deng", 
    -19003 
   ), 
   array ( 
    "di", 
    -18996 
   ), 
   array ( 
    "dian", 
    -18977 
   ), 
   array ( 
    "diao", 
    -18961 
   ), 
   array ( 
    "die", 
    -18952 
   ), 
   array ( 
    "ding", 
    -18783 
   ), 
   array ( 
    "diu", 
    -18774 
   ), 
   array ( 
    "dong", 
    -18773 
   ), 
   array ( 
    "dou", 
    -18763 
   ), 
   array ( 
    "du", 
    -18756 
   ), 
   array ( 
    "duan", 
    -18741 
   ), 
   array ( 
    "dui", 
    -18735 
   ), 
   array ( 
    "dun", 
    -18731 
   ), 
   array ( 
    "duo", 
    -18722 
   ), 
   array ( 
    "e", 
    -18710 
   ), 
   array ( 
    "en", 
    -18697 
   ), 
   array ( 
    "er", 
    -18696 
   ), 
   array ( 
    "fa", 
    -18526 
   ), 
   array ( 
    "fan", 
    -18518 
   ), 
   array ( 
    "fang", 
    -18501 
   ), 
   array ( 
    "fei", 
    -18490 
   ), 
   array ( 
    "fen", 
    -18478 
   ), 
   array ( 
    "feng", 
    -18463 
   ), 
   array ( 
    "fo", 
    -18448 
   ), 
   array ( 
    "fou", 
    -18447 
   ), 
   array ( 
    "fu", 
    -18446 
   ), 
   array ( 
    "ga", 
    -18239 
   ), 
   array ( 
    "gai", 
    -18237 
   ), 
   array ( 
    "gan", 
    -18231 
   ), 
   array ( 
    "gang", 
    -18220 
   ), 
   array ( 
    "gao", 
    -18211 
   ), 
   array ( 
    "ge", 
    -18201 
   ), 
   array ( 
    "gei", 
    -18184 
   ), 
   array ( 
    "gen", 
    -18183 
   ), 
   array ( 
    "geng", 
    -18181 
   ), 
   array ( 
    "gong", 
    -18012 
   ), 
   array ( 
    "gou", 
    -17997 
   ), 
   array ( 
    "gu", 
    -17988 
   ), 
   array ( 
    "gua", 
    -17970 
   ), 
   array ( 
    "guai", 
    -17964 
   ), 
   array ( 
    "guan", 
    -17961 
   ), 
   array ( 
    "guang", 
    -17950 
   ), 
   array ( 
    "gui", 
    -17947 
   ), 
   array ( 
    "gun", 
    -17931 
   ), 
   array ( 
    "guo", 
    -17928 
   ), 
   array ( 
    "ha", 
    -17922 
   ), 
   array ( 
    "hai", 
    -17759 
   ), 
   array ( 
    "han", 
    -17752 
   ), 
   array ( 
    "hang", 
    -17733 
   ), 
   array ( 
    "hao", 
    -17730 
   ), 
   array ( 
    "he", 
    -17721 
   ), 
   array ( 
    "hei", 
    -17703 
   ), 
   array ( 
    "hen", 
    -17701 
   ), 
   array ( 
    "heng", 
    -17697 
   ), 
   array ( 
    "hong", 
    -17692 
   ), 
   array ( 
    "hou", 
    -17683 
   ), 
   array ( 
    "hu", 
    -17676 
   ), 
   array ( 
    "hua", 
    -17496 
   ), 
   array ( 
    "huai", 
    -17487 
   ), 
   array ( 
    "huan", 
    -17482 
   ), 
   array ( 
    "huang", 
    -17468 
   ), 
   array ( 
    "hui", 
    -17454 
   ), 
   array ( 
    "hun", 
    -17433 
   ), 
   array ( 
    "huo", 
    -17427 
   ), 
   array ( 
    "ji", 
    -17417 
   ), 
   array ( 
    "jia", 
    -17202 
   ), 
   array ( 
    "jian", 
    -17185 
   ), 
   array ( 
    "jiang", 
    -16983 
   ), 
   array ( 
    "jiao", 
    -16970 
   ), 
   array ( 
    "jie", 
    -16942 
   ), 
   array ( 
    "jin", 
    -16915 
   ), 
   array ( 
    "jing", 
    -16733 
   ), 
   array ( 
    "jiong", 
    -16708 
   ), 
   array ( 
    "jiu", 
    -16706 
   ), 
   array ( 
    "ju", 
    -16689 
   ), 
   array ( 
    "juan", 
    -16664 
   ), 
   array ( 
    "jue", 
    -16657 
   ), 
   array ( 
    "jun", 
    -16647 
   ), 
   array ( 
    "ka", 
    -16474 
   ), 
   array ( 
    "kai", 
    -16470 
   ), 
   array ( 
    "kan", 
    -16465 
   ), 
   array ( 
    "kang", 
    -16459 
   ), 
   array ( 
    "kao", 
    -16452 
   ), 
   array ( 
    "ke", 
    -16448 
   ), 
   array ( 
    "ken", 
    -16433 
   ), 
   array ( 
    "keng", 
    -16429 
   ), 
   array ( 
    "kong", 
    -16427 
   ), 
   array ( 
    "kou", 
    -16423 
   ), 
   array ( 
    "ku", 
    -16419 
   ), 
   array ( 
    "kua", 
    -16412 
   ), 
   array ( 
    "kuai", 
    -16407 
   ), 
   array ( 
    "kuan", 
    -16403 
   ), 
   array ( 
    "kuang", 
    -16401 
   ), 
   array ( 
    "kui", 
    -16393 
   ), 
   array ( 
    "kun", 
    -16220 
   ), 
   array ( 
    "kuo", 
    -16216 
   ), 
   array ( 
    "la", 
    -16212 
   ), 
   array ( 
    "lai", 
    -16205 
   ), 
   array ( 
    "lan", 
    -16202 
   ), 
   array ( 
    "lang", 
    -16187 
   ), 
   array ( 
    "lao", 
    -16180 
   ), 
   array ( 
    "le", 
    -16171 
   ), 
   array ( 
    "lei", 
    -16169 
   ), 
   array ( 
    "leng", 
    -16158 
   ), 
   array ( 
    "li", 
    -16155 
   ), 
   array ( 
    "lia", 
    -15959 
   ), 
   array ( 
    "lian", 
    -15958 
   ), 
   array ( 
    "liang", 
    -15944 
   ), 
   array ( 
    "liao", 
    -15933 
   ), 
   array ( 
    "lie", 
    -15920 
   ), 
   array ( 
    "lin", 
    -15915 
   ), 
   array ( 
    "ling", 
    -15903 
   ), 
   array ( 
    "liu", 
    -15889 
   ), 
   array ( 
    "long", 
    -15878 
   ), 
   array ( 
    "lou", 
    -15707 
   ), 
   array ( 
    "lu", 
    -15701 
   ), 
   array ( 
    "lv", 
    -15681 
   ), 
   array ( 
    "luan", 
    -15667 
   ), 
   array ( 
    "lue", 
    -15661 
   ), 
   array ( 
    "lun", 
    -15659 
   ), 
   array ( 
    "luo", 
    -15652 
   ), 
   array ( 
    "ma", 
    -15640 
   ), 
   array ( 
    "mai", 
    -15631 
   ), 
   array ( 
    "man", 
    -15625 
   ), 
   array ( 
    "mang", 
    -15454 
   ), 
   array ( 
    "mao", 
    -15448 
   ), 
   array ( 
    "me", 
    -15436 
   ), 
   array ( 
    "mei", 
    -15435 
   ), 
   array ( 
    "men", 
    -15419 
   ), 
   array ( 
    "meng", 
    -15416 
   ), 
   array ( 
    "mi", 
    -15408 
   ), 
   array ( 
    "mian", 
    -15394 
   ), 
   array ( 
    "miao", 
    -15385 
   ), 
   array ( 
    "mie", 
    -15377 
   ), 
   array ( 
    "min", 
    -15375 
   ), 
   array ( 
    "ming", 
    -15369 
   ), 
   array ( 
    "miu", 
    -15363 
   ), 
   array ( 
    "mo", 
    -15362 
   ), 
   array ( 
    "mou", 
    -15183 
   ), 
   array ( 
    "mu", 
    -15180 
   ), 
   array ( 
    "na", 
    -15165 
   ), 
   array ( 
    "nai", 
    -15158 
   ), 
   array ( 
    "nan", 
    -15153 
   ), 
   array ( 
    "nang", 
    -15150 
   ), 
   array ( 
    "nao", 
    -15149 
   ), 
   array ( 
    "ne", 
    -15144 
   ), 
   array ( 
    "nei", 
    -15143 
   ), 
   array ( 
    "nen", 
    -15141 
   ), 
   array ( 
    "neng", 
    -15140 
   ), 
   array ( 
    "ni", 
    -15139 
   ), 
   array ( 
    "nian", 
    -15128 
   ), 
   array ( 
    "niang", 
    -15121 
   ), 
   array ( 
    "niao", 
    -15119 
   ), 
   array ( 
    "nie", 
    -15117 
   ), 
   array ( 
    "nin", 
    -15110 
   ), 
   array ( 
    "ning", 
    -15109 
   ), 
   array ( 
    "niu", 
    -14941 
   ), 
   array ( 
    "nong", 
    -14937 
   ), 
   array ( 
    "nu", 
    -14933 
   ), 
   array ( 
    "nv", 
    -14930 
   ), 
   array ( 
    "nuan", 
    -14929 
   ), 
   array ( 
    "nue", 
    -14928 
   ), 
   array ( 
    "nuo", 
    -14926 
   ), 
   array ( 
    "o", 
    -14922 
   ), 
   array ( 
    "ou", 
    -14921 
   ), 
   array ( 
    "pa", 
    -14914 
   ), 
   array ( 
    "pai", 
    -14908 
   ), 
   array ( 
    "pan", 
    -14902 
   ), 
   array ( 
    "pang", 
    -14894 
   ), 
   array ( 
    "pao", 
    -14889 
   ), 
   array ( 
    "pei", 
    -14882 
   ), 
   array ( 
    "pen", 
    -14873 
   ), 
   array ( 
    "peng", 
    -14871 
   ), 
   array ( 
    "pi", 
    -14857 
   ), 
   array ( 
    "pian", 
    -14678 
   ), 
   array ( 
    "piao", 
    -14674 
   ), 
   array ( 
    "pie", 
    -14670 
   ), 
   array ( 
    "pin", 
    -14668 
   ), 
   array ( 
    "ping", 
    -14663 
   ), 
   array ( 
    "po", 
    -14654 
   ), 
   array ( 
    "pu", 
    -14645 
   ), 
   array ( 
    "qi", 
    -14630 
   ), 
   array ( 
    "qia", 
    -14594 
   ), 
   array ( 
    "qian", 
    -14429 
   ), 
   array ( 
    "qiang", 
    -14407 
   ), 
   array ( 
    "qiao", 
    -14399 
   ), 
   array ( 
    "qie", 
    -14384 
   ), 
   array ( 
    "qin", 
    -14379 
   ), 
   array ( 
    "qing", 
    -14368 
   ), 
   array ( 
    "qiong", 
    -14355 
   ), 
   array ( 
    "qiu", 
    -14353 
   ), 
   array ( 
    "qu", 
    -14345 
   ), 
   array ( 
    "quan", 
    -14170 
   ), 
   array ( 
    "que", 
    -14159 
   ), 
   array ( 
    "qun", 
    -14151 
   ), 
   array ( 
    "ran", 
    -14149 
   ), 
   array ( 
    "rang", 
    -14145 
   ), 
   array ( 
    "rao", 
    -14140 
   ), 
   array ( 
    "re", 
    -14137 
   ), 
   array ( 
    "ren", 
    -14135 
   ), 
   array ( 
    "reng", 
    -14125 
   ), 
   array ( 
    "ri", 
    -14123 
   ), 
   array ( 
    "rong", 
    -14122 
   ), 
   array ( 
    "rou", 
    -14112 
   ), 
   array ( 
    "ru", 
    -14109 
   ), 
   array ( 
    "ruan", 
    -14099 
   ), 
   array ( 
    "rui", 
    -14097 
   ), 
   array ( 
    "run", 
    -14094 
   ), 
   array ( 
    "ruo", 
    -14092 
   ), 
   array ( 
    "sa", 
    -14090 
   ), 
   array ( 
    "sai", 
    -14087 
   ), 
   array ( 
    "san", 
    -14083 
   ), 
   array ( 
    "sang", 
    -13917 
   ), 
   array ( 
    "sao", 
    -13914 
   ), 
   array ( 
    "se", 
    -13910 
   ), 
   array ( 
    "sen", 
    -13907 
   ), 
   array ( 
    "seng", 
    -13906 
   ), 
   array ( 
    "sha", 
    -13905 
   ), 
   array ( 
    "shai", 
    -13896 
   ), 
   array ( 
    "shan", 
    -13894 
   ), 
   array ( 
    "shang", 
    -13878 
   ), 
   array ( 
    "shao", 
    -13870 
   ), 
   array ( 
    "she", 
    -13859 
   ), 
   array ( 
    "shen", 
    -13847 
   ), 
   array ( 
    "sheng", 
    -13831 
   ), 
   array ( 
    "shi", 
    -13658 
   ), 
   array ( 
    "shou", 
    -13611 
   ), 
   array ( 
    "shu", 
    -13601 
   ), 
   array ( 
    "shua", 
    -13406 
   ), 
   array ( 
    "shuai", 
    -13404 
   ), 
   array ( 
    "shuan", 
    -13400 
   ), 
   array ( 
    "shuang", 
    -13398 
   ), 
   array ( 
    "shui", 
    -13395 
   ), 
   array ( 
    "shun", 
    -13391 
   ), 
   array ( 
    "shuo", 
    -13387 
   ), 
   array ( 
    "si", 
    -13383 
   ), 
   array ( 
    "song", 
    -13367 
   ), 
   array ( 
    "sou", 
    -13359 
   ), 
   array ( 
    "su", 
    -13356 
   ), 
   array ( 
    "suan", 
    -13343 
   ), 
   array ( 
    "sui", 
    -13340 
   ), 
   array ( 
    "sun", 
    -13329 
   ), 
   array ( 
    "suo", 
    -13326 
   ), 
   array ( 
    "ta", 
    -13318 
   ), 
   array ( 
    "tai", 
    -13147 
   ), 
   array ( 
    "tan", 
    -13138 
   ), 
   array ( 
    "tang", 
    -13120 
   ), 
   array ( 
    "tao", 
    -13107 
   ), 
   array ( 
    "te", 
    -13096 
   ), 
   array ( 
    "teng", 
    -13095 
   ), 
   array ( 
    "ti", 
    -13091 
   ), 
   array ( 
    "tian", 
    -13076 
   ), 
   array ( 
    "tiao", 
    -13068 
   ), 
   array ( 
    "tie", 
    -13063 
   ), 
   array ( 
    "ting", 
    -13060 
   ), 
   array ( 
    "tong", 
    -12888 
   ), 
   array ( 
    "tou", 
    -12875 
   ), 
   array ( 
    "tu", 
    -12871 
   ), 
   array ( 
    "tuan", 
    -12860 
   ), 
   array ( 
    "tui", 
    -12858 
   ), 
   array ( 
    "tun", 
    -12852 
   ), 
   array ( 
    "tuo", 
    -12849 
   ), 
   array ( 
    "wa", 
    -12838 
   ), 
   array ( 
    "wai", 
    -12831 
   ), 
   array ( 
    "wan", 
    -12829 
   ), 
   array ( 
    "wang", 
    -12812 
   ), 
   array ( 
    "wei", 
    -12802 
   ), 
   array ( 
    "wen", 
    -12607 
   ), 
   array ( 
    "weng", 
    -12597 
   ), 
   array ( 
    "wo", 
    -12594 
   ), 
   array ( 
    "wu", 
    -12585 
   ), 
   array ( 
    "xi", 
    -12556 
   ), 
   array ( 
    "xia", 
    -12359 
   ), 
   array ( 
    "xian", 
    -12346 
   ), 
   array ( 
    "xiang", 
    -12320 
   ), 
   array ( 
    "xiao", 
    -12300 
   ), 
   array ( 
    "xie", 
    -12120 
   ), 
   array ( 
    "xin", 
    -12099 
   ), 
   array ( 
    "xing", 
    -12089 
   ), 
   array ( 
    "xiong", 
    -12074 
   ), 
   array ( 
    "xiu", 
    -12067 
   ), 
   array ( 
    "xu", 
    -12058 
   ), 
   array ( 
    "xuan", 
    -12039 
   ), 
   array ( 
    "xue", 
    -11867 
   ), 
   array ( 
    "xun", 
    -11861 
   ), 
   array ( 
    "ya", 
    -11847 
   ), 
   array ( 
    "yan", 
    -11831 
   ), 
   array ( 
    "yang", 
    -11798 
   ), 
   array ( 
    "yao", 
    -11781 
   ), 
   array ( 
    "ye", 
    -11604 
   ), 
   array ( 
    "yi", 
    -11589 
   ), 
   array ( 
    "yin", 
    -11536 
   ), 
   array ( 
    "ying", 
    -11358 
   ), 
   array ( 
    "yo", 
    -11340 
   ), 
   array ( 
    "yong", 
    -11339 
   ), 
   array ( 
    "you", 
    -11324 
   ), 
   array ( 
    "yu", 
    -11303 
   ), 
   array ( 
    "yuan", 
    -11097 
   ), 
   array ( 
    "yue", 
    -11077 
   ), 
   array ( 
    "yun", 
    -11067 
   ), 
   array ( 
    "za", 
    -11055 
   ), 
   array ( 
    "zai", 
    -11052 
   ), 
   array ( 
    "zan", 
    -11045 
   ), 
   array ( 
    "zang", 
    -11041 
   ), 
   array ( 
    "zao", 
    -11038 
   ), 
   array ( 
    "ze", 
    -11024 
   ), 
   array ( 
    "zei", 
    -11020 
   ), 
   array ( 
    "zen", 
    -11019 
   ), 
   array ( 
    "zeng", 
    -11018 
   ), 
   array ( 
    "zha", 
    -11014 
   ), 
   array ( 
    "zhai", 
    -10838 
   ), 
   array ( 
    "zhan", 
    -10832 
   ), 
   array ( 
    "zhang", 
    -10815 
   ), 
   array ( 
    "zhao", 
    -10800 
   ), 
   array ( 
    "zhe", 
    -10790 
   ), 
   array ( 
    "zhen", 
    -10780 
   ), 
   array ( 
    "zheng", 
    -10764 
   ), 
   array ( 
    "zhi", 
    -10587 
   ), 
   array ( 
    "zhong", 
    -10544 
   ), 
   array ( 
    "zhou", 
    -10533 
   ), 
   array ( 
    "zhu", 
    -10519 
   ), 
   array ( 
    "zhua", 
    -10331 
   ), 
   array ( 
    "zhuai", 
    -10329 
   ), 
   array ( 
    "zhuan", 
    -10328 
   ), 
   array ( 
    "zhuang", 
    -10322 
   ), 
   array ( 
    "zhui", 
    -10315 
   ), 
   array ( 
    "zhun", 
    -10309 
   ), 
   array ( 
    "zhuo", 
    -10307 
   ), 
   array ( 
    "zi", 
    -10296 
   ), 
   array ( 
    "zong", 
    -10281 
   ), 
   array ( 
    "zou", 
    -10274 
   ), 
   array ( 
    "zu", 
    -10270 
   ), 
   array ( 
    "zuan", 
    -10262 
   ), 
   array ( 
    "zui", 
    -10260 
   ), 
   array ( 
    "zun", 
    -10256 
   ), 
   array ( 
    "zuo", 
    -10254 
   ) 
  ); 
 
 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, 0, 1);   return $ret;  } 
 function f($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);   }   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, $i, 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可以实现公农历互转功能。用法:
 require_once("Lunar.class.php"); 
 $lunar = new Lunar(); 
   
 $date = $lunar->convertLunarToSolar(2013,8,17); //公历转农历 
 print_r($date);

执行后输出数组:
 Array ( [0] => 二零一三 [1] => 七月 [2] => 十一 [3] => 癸巳  
 [4] => 7 [5] => 11 [6] => 蛇 [7] => 0 ) 

如果要将农历转换成公历则使用:
 $date = $lunar->convertLunarToSolar(2013,8,17); //农历转公历 
 print_r($date);

执行后输出数组:
 Array ( [0] => 2013 [1] => 09 [2] => 21 ) 

Lunar.class.php源码:

 <?php 
 class Lunar { 
    var $MIN_YEAR = 1891; 
     var $MAX_YEAR = 2100; 
     var $lunarInfo = array( 
         array(0,2,9,21936),array(6,1,30,9656),array(0,2,17,9584),array(0,2,6,21168),array(5,1,26,43344),array(0,2,13,59728), 
         array(0,2,2,27296),array(3,1,22,44368),array(0,2,10,43856),array(8,1,30,19304),array(0,2,19,19168),array(0,2,8,42352), 
         array(5,1,29,21096),array(0,2,16,53856),array(0,2,4,55632),array(4,1,25,27304),array(0,2,13,22176),array(0,2,2,39632), 
         array(2,1,22,19176),array(0,2,10,19168),array(6,1,30,42200),array(0,2,18,42192),array(0,2,6,53840),array(5,1,26,54568), 
         array(0,2,14,46400),array(0,2,3,54944),array(2,1,23,38608),array(0,2,11,38320),array(7,2,1,18872),array(0,2,20,18800), 
         array(0,2,8,42160),array(5,1,28,45656),array(0,2,16,27216),array(0,2,5,27968),array(4,1,24,44456),array(0,2,13,11104), 
         array(0,2,2,38256),array(2,1,23,18808),array(0,2,10,18800),array(6,1,30,25776),array(0,2,17,54432),array(0,2,6,59984), 
         array(5,1,26,27976),array(0,2,14,23248),array(0,2,4,11104),array(3,1,24,37744),array(0,2,11,37600),array(7,1,31,51560), 
         array(0,2,19,51536),array(0,2,8,54432),array(6,1,27,55888),array(0,2,15,46416),array(0,2,5,22176),array(4,1,25,43736), 
         array(0,2,13,9680),array(0,2,2,37584),array(2,1,22,51544),array(0,2,10,43344),array(7,1,29,46248),array(0,2,17,27808), 
         array(0,2,6,46416),array(5,1,27,21928),array(0,2,14,19872),array(0,2,3,42416),array(3,1,24,21176),array(0,2,12,21168), 
         array(8,1,31,43344),array(0,2,18,59728),array(0,2,8,27296),array(6,1,28,44368),array(0,2,15,43856),array(0,2,5,19296), 
         array(4,1,25,42352),array(0,2,13,42352),array(0,2,2,21088),array(3,1,21,59696),array(0,2,9,55632),array(7,1,30,23208), 
         array(0,2,17,22176),array(0,2,6,38608),array(5,1,27,19176),array(0,2,15,19152),array(0,2,3,42192),array(4,1,23,53864), 
         array(0,2,11,53840),array(8,1,31,54568),array(0,2,18,46400),array(0,2,7,46752),array(6,1,28,38608),array(0,2,16,38320), 
         array(0,2,5,18864),array(4,1,25,42168),array(0,2,13,42160),array(10,2,2,45656),array(0,2,20,27216),array(0,2,9,27968), 
         array(6,1,29,44448),array(0,2,17,43872),array(0,2,6,38256),array(5,1,27,18808),array(0,2,15,18800),array(0,2,4,25776), 
         array(3,1,23,27216),array(0,2,10,59984),array(8,1,31,27432),array(0,2,19,23232),array(0,2,7,43872),array(5,1,28,37736), 
         array(0,2,16,37600),array(0,2,5,51552),array(4,1,24,54440),array(0,2,12,54432),array(0,2,1,55888),array(2,1,22,23208), 
         array(0,2,9,22176),array(7,1,29,43736),array(0,2,18,9680),array(0,2,7,37584),array(5,1,26,51544),array(0,2,14,43344), 
         array(0,2,3,46240),array(4,1,23,46416),array(0,2,10,44368),array(9,1,31,21928),array(0,2,19,19360),array(0,2,8,42416), 
         array(6,1,28,21176),array(0,2,16,21168),array(0,2,5,43312),array(4,1,25,29864),array(0,2,12,27296),array(0,2,1,44368), 
         array(2,1,22,19880),array(0,2,10,19296),array(6,1,29,42352),array(0,2,17,42208),array(0,2,6,53856),array(5,1,26,59696), 
         array(0,2,13,54576),array(0,2,3,23200),array(3,1,23,27472),array(0,2,11,38608),array(11,1,31,19176),array(0,2,19,19152), 
         array(0,2,8,42192),array(6,1,28,53848),array(0,2,15,53840),array(0,2,4,54560),array(5,1,24,55968),array(0,2,12,46496), 
         array(0,2,1,22224),array(2,1,22,19160),array(0,2,10,18864),array(7,1,30,42168),array(0,2,17,42160),array(0,2,6,43600), 
         array(5,1,26,46376),array(0,2,14,27936),array(0,2,2,44448),array(3,1,23,21936),array(0,2,11,37744),array(8,2,1,18808), 
         array(0,2,19,18800),array(0,2,8,25776),array(6,1,28,27216),array(0,2,15,59984),array(0,2,4,27424),array(4,1,24,43872), 
         array(0,2,12,43744),array(0,2,2,37600),array(3,1,21,51568),array(0,2,9,51552),array(7,1,29,54440),array(0,2,17,54432), 
         array(0,2,5,55888),array(5,1,26,23208),array(0,2,14,22176),array(0,2,3,42704),array(4,1,23,21224),array(0,2,11,21200), 
         array(8,1,31,43352),array(0,2,19,43344),array(0,2,7,46240),array(6,1,27,46416),array(0,2,15,44368),array(0,2,5,21920), 
         array(4,1,24,42448),array(0,2,12,42416),array(0,2,2,21168),array(3,1,22,43320),array(0,2,9,26928),array(7,1,29,29336), 
         array(0,2,17,27296),array(0,2,6,44368),array(5,1,26,19880),array(0,2,14,19296),array(0,2,3,42352),array(4,1,24,21104), 
         array(0,2,10,53856),array(8,1,30,59696),array(0,2,18,54560),array(0,2,7,55968),array(6,1,27,27472),array(0,2,15,22224), 
         array(0,2,5,19168),array(4,1,25,42216),array(0,2,12,42192),array(0,2,1,53584),array(2,1,21,55592),array(0,2,9,54560) 
     ); 
     /** 
      * 将阳历转换为阴历 
      * @param year 公历-年 
      * @param month 公历-月 
      * @param date 公历-日 
      */ 
     function convertSolarToLunar($year,$month,$date){ 
         //debugger; 
         $yearData = $this->lunarInfo[$year-$this->MIN_YEAR]; 
         if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){ 
             return array(1891,'正月','初一','辛卯',1,1,'兔'); 
         } 
         return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$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,'正月','初一','辛卯',1,1,'兔');         }         $month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 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,$this->getDaysBetweenSolar($year, $month, $i, $yearData[1], $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,$month,$date){         $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];         $between = $this->getDaysBetweenLunar($year,$month,$date);         $res = mktime(0,0,0,$yearData[1],$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, $month, $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, $i, 1);         }         for($k=0,$klen=16-count($bitArray);$k<$klen;$k++){             array_unshift($bitArray, '0');         }         $bitArray = array_slice($bitArray,0,($leapMonth==0?12:13));         for($i=0; $i<count($bitArray); $i++){             $bitArray[$i] = $bitArray[$i] + 29;         }         return $bitArray;     }     /**      * 获取农历每年的天数      * @param year 农历年份      */     function getLunarYearDays($year){         $yearData = $this->lunarInfo[$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,$month,$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,0,0,$cmonth,$cdate,$year);         $b = mktime(0,0,0,$dmonth,$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年后的转换会出问题了,大家有空可以研究下,如果您有更好的实现代码,欢迎分享。

需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。