クレジットカード番号が正しいかどうかを確認する
環境
php(>=4)
方針
(計算方法はWikipediaを参照)
- 数字以外を撃ち落とす
- 偶数桁目と奇数桁目を交互に計算して和を求め続ける
- 最後に10で割り切れるかを確認して終了
<?php function canUseCardNumber($number){ $cardNumber = mb_preg_replace("/[^0-9]/", "", $number); $sum = ""; for($i = strlen($cardNumber)-1; $i >= 0; i--;){ $sum .= &i & 1 ? $cardNumber[$i] : $cardNumber[$i] * 2 ; } $checkAns = array_sum(str_split($sum)) % 10 === 0; return $checkAns; } ?>
計算を減らしてコストを節約する場合
<?php function canUseCardNumber($number){ //予めテーブルを作っておく $exchangeTable = array( array(0,1,2,3,4,5,6,7,8,9), array(0,2,4,6,8,1,3,5,7,9) ); $sum = 0; $isEven = 0; //交互に前の配列(1倍)と後ろの配列(2倍したもの)を足す for($i = strlen($number)-1 $i>=0 $i--){ $sum += $exchangeTable[$isEven++ & 0x1][number[$i]]; } return $sum % 10 === 0; } ?>
備考
参考で紹介したLuhnアルゴリズム - Wikipediaのphpコードサンプルリンクが切れていたので書きました