作者chaoms (小企鵝)
看板PHP
標題Re: [請益] 請教台灣身份證演算法
時間Wed Aug 28 08:56:58 2013
※ 引述《mydoc (mydoc)》之銘言:
: $j =
: array(A=>10,B=>11,C=>12,D=>13,E=>14,F=>15,G=>16,H=>17,I=>34,J=>18,K=>19,
: L=>20,M=>21,N=>22,O=>35,P=>23,Q=>24,R=>25,S=>26,T=>27,U=>28,V=>29,W=>30,
: X=>31,Y=>32,Z=>33);
: $str="A123456789";
: $i = str_split($str);
: $i[0]=$j[$i[0]];
: $i = "$i[0]$i[1]$i[2]$i[3]$i[4]$i[5]$i[6]$i[7]$i[8]$i[9]";
: $i = str_split($i);
: $j =
: ($i[0]*1)+($i[1]*9)+($i[2]*8)+($i[3]*7)+($i[4]*6)+($i[5]*5)+
: ($i[6]*4)+($i[7]*3)+($i[8]*2)+($i[9]*1);
: $j = $j%10;
: $j = 10-$j ;
: print_r($j);
: 台灣身份證算法大家應該都知道..但我不會寫演算法
: 只能用很笨很暴力的方法把字串切開再合起來再切開再算
: 請問還有更好的算法嗎?另外對於中低手比較推薦哪本PHP的書藉?
字串也可直接當陣列使用呀
// 等同你的$i[0];
$one = strval(10 + strpos("ABCDEFGHJKLMNPQRSTUVXYWZIO", $str[0]));
// 等同你的$j
$no1 = $one[1] * 9 + $one[0];
for ($i=8; $i>=1; $i--) {
$no2 += $str[9-$i] * $i;
}
$no3 = $no1 + $no2 + $str[9];
// 驗證 ($no3 % 10 == 0);
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 115.80.143.25
→ alpe:字串直接當陣列, 好像是php 5.1 的事,所以舊的寫法都不會這樣 08/28 13:21
→ chaoms:樓上,到目前的php版本一直都可以喔,可以試試看 08/28 14:05
→ fri13:書要看新一點的歐 我遇過現在還在看php4的人XD 08/30 16:21
推 alpe:只是要警告, 當你遇到php版本不再5+ 得時候會error 08/31 14:01