面試題,當時寫了一個漏洞百出,被人鄙視了,因此回來用一上午寫了一個,本身測試了一下,好像還能夠。面試
思路數組
如中文數字 測試
七百七十八萬億四千七百二十億七千五百七十萬四千四百八十六
若是把紅色文字看作單位,那麼用這些單位分割後,其餘部分都是個十百千的數字。把這些數字乘以其單位求和,就是結果了。
代碼
function ch2num($str){ //單位數組用於循環遍歷,單位順序從大到小 $c = [ '萬億'=>1000000000000, '億' => 100000000, '萬' => 10000, ]; //中文替換數字規則,零沒什麼卵用;因此去掉 $b = [ '一' =>1, '二' =>2, '三' =>3, '四' =>4, '五' =>5, '六' =>6, '七' =>7, '八' =>8, '九' =>9, '零' =>'', ]; //替換數字 $str = str_replace(array_keys($b), array_values($b), $str); //結果 7百7十8萬億4千7百2十億7千5百7十萬4千4百8十 //若是字符串以十開頭,前邊加1 if(mb_strpos($str, '十' ,0 ,'utf-8') === 0) $str = '1'.$str; //初始化一個數組 $arr[] = array( 'str' => $str, //字符串 'unit' => 1, //單位 ); //將字符串按單位切分 foreach ($c as $key => $value) { $brr = []; foreach ($arr as $item) { if(strpos($item['str'], $key)){ $sun = explode($key, $item['str'],2); $brr[] = [ 'str' => $sun[0], 'unit' => $value, ]; $brr[] = [ 'str' => $sun[1], 'unit' => $item['unit'], ]; }else{ $brr[] = $item; } } $arr = $brr; } /* 結果 ( [0] => Array ( [str] => 7百7十8 [unit] => 1000000000000 ) [1] => Array ( [str] => 4千7百2十 [unit] => 100000000 ) [2] => Array ( [str] => 7千5百7十 [unit] => 10000 ) [3] => Array ( [str] => 4千4百8十6 [unit] => 1 ) )*/ //遍歷求和 $sum = 0; foreach ($arr as $item) { $sum += getNum($item['str'],$item['unit']); } return $sum; } //將分組後的字符串轉化成數字,並乘以單位 function getNum($str,$st){ //倍數 $a = [ '千'=>1000, '百'=>100, '十'=>10 ]; //開始值 $num = 0; //當前值所在位數 $step = 1; //單位 $un = 1; $arr = preg_split('/(?<!^)(?!$)/u', $str); while (count($arr)) { $m = array_pop($arr); //若是是位數;更新倍數 if(!empty($a[$m])){ $step = $a[$m]; } if(is_numeric($m)){ $num += $m * $step; } } return $num * $st; }