请使用一句话将类似“1910-09-09”的日期各式转换为“一九一零年九月九日”这样的各式。(需要有通用性,是不是一句话不是关键,但不允许使用if\switch\while\for等语句)。我自己写的 实在太烂了
网其他各位给出个好算法
function changeToDate($str)
{
$numtostr=array(
   '0'=>'零',
   '1'=>'一',
   '2'=>'二',
   '3'=>'三',
   '4'=>'四',
   '5'=>'五',
   '6'=>'六',
   '7'=>'七',
   '8'=>'八',
   '9'=>'九'
);
$numtostr1=array(
   '0'=>'',
   '1'=>'一',
   '2'=>'二',
   '3'=>'三',
   '4'=>'四',
   '5'=>'五',
   '6'=>'六',
   '7'=>'七',
   '8'=>'八',
   '9'=>'九'
);
    $str=str_replace('-','',$str);
    $str=str_split($str);
    $str0=$numtostr[$str[0]];
    $str1=$numtostr[$str[1]];
    $str2=$numtostr[$str[2]];
    $str3=$numtostr[$str[3]];
    
    $str4=$numtostr1[$str[4]];
    $str5=$numtostr1[$str[5]];
    
    $str6=$numtostr1[$str[6]];
    $str7=$numtostr1[$str[7]];
    
    $datestr=$str0.$str1.$str2.$str3."年".$str4.$str5."月".$str6.$str7."日";
    return $datestr;
}
$str="1604-09-20";
$date=changeToDate($str);
echo $date;

解决方案 »

  1.   


    $str="1604-09-20";$str1 = preg_replace("/(\d{4})(-)(\d{1,2})(-)(\d{1,2})/e","dateFormat('\\1','\\3','\\5')",$str);function dateFormat($year,$mon,$day){
        $format = array('零','一','二','三','四','五','六','七','八','九','年','月','日');
        $year   = preg_split("//",$year, -1, PREG_SPLIT_NO_EMPTY);
        $year[] = 10;
        $mon    = preg_split("//",ltrim($mon,'0'), -1, PREG_SPLIT_NO_EMPTY);
        $mon[]  = 11;
        $day    = preg_split("//",ltrim($day,'0'), -1, PREG_SPLIT_NO_EMPTY);
        $day[]  = 12;
        $dateAr = array_merge($year,$mon,$day);
        $ret = '';
        foreach($dateAr as $key)
            $ret .=$format[$key];
        return $ret;
    }
    echo $str1;
    想不出好的,上面我写的...
      

  2.   

    $a = array( '0' => '零', 
    '1' => '一', 
    '2' => '二', 
    '3' => '三', 
    '4' => '四', 
    '5' => '五', 
    '6' => '六', 
    '7' => '七', 
    '8' => '八', 
    '9' => '九');
    $y = date('Y', time());
    $m = date('m', time());
    $d = date('d', time());
    echo strtr($y, $a), '年', strtr($m, $a), '月', strtr($d, $a), '日';
      

  3.   

    看看这一句如何?echo strtr(date('Y年n月j日',
     strtotime('1910-09-09')),
     array(
      '0' => '零',  
      '1' => '一',  
      '2' => '二',  
      '3' => '三',  
      '4' => '四',  
      '5' => '五',  
      '6' => '六',  
      '7' => '七',  
      '8' => '八',  
      '9' => '九'
    ));
      

  4.   

    看来我傻了,不过也发出来吧$a = array( '0' => '零', '1' => '一', '2' => '二', '3' => '三', '4' => '四', '5' => '五', '6' => '六', '7' => '七', '8' => '八', '9' => '九');
    $y = date('Y', time());
    $m = intval(date('m', time()));
    $d = intval(date('d', time()));
    echo strtr($y, $a), '年', strtr($m, $a), '月', strlen($d) == 2? strtr(substr($d, 0, 1) == '1'? '': substr($d, 0, 1), $a).'十': strtr(substr($d, 0, 1), $a), strtr(substr($d, 1), $a), '日';
      

  5.   

    echo strtr(date('Y年n月j日',
     strtotime('1910-09-09')),
     array(
      '0' => '零',  
      '1' => '一',  
      '2' => '二',  
      '3' => '三',  
      '4' => '四',  
      '5' => '五',  
      '6' => '六',  
      '7' => '七',  
      '8' => '八',  
      '9' => '九'
    ));
    这句和我的效果是一样的 但是很精确
    但是有一个问题 就是
    1910-12-09
    会出现
    一九一零年一二月九日 
    应该是
    一九一零年十二月九日 
    不知道我理解题目错了还是
      

  6.   

    $str="1604-09-20"; $str1 = preg_replace("/(\d{4})(-)(\d{1,2})(-)(\d{1,2})/e","dateFormat('\\1','\\3','\\5')",$str); function dateFormat($year,$mon,$day){ $format = array('零','一','二','三','四','五','六','七','八','九','年','月','日'); $year = preg_split("//",$year, -1, PREG_SPLIT_NO_EMPTY); $year[] = 10; $mon = preg_split("//",ltrim($mon,'0'), -1, PREG_SPLIT_NO_EMPTY); $mon[] = 11; $day = preg_split("//",ltrim($day,'0'), -1, PREG_SPLIT_NO_EMPTY); $day[] = 12; $dateAr = array_merge($year,$mon,$day); $ret = ''; foreach($dateAr as $key) $ret .=$format[$key]; return $ret; } echo $str1;
    不能使用foreach吧 汗 连while都不能用