狐の避暑地

PHPやJavaでプログラミングをしてます。狐が好きです。備忘録やゲームについて置いてあります。

クレジットカード番号が正しいかどうかを確認する

使う目的

環境

php(>=4)

方針

(計算方法はWikipediaを参照)

  1. 数字以外を撃ち落とす
  2. 偶数桁目と奇数桁目を交互に計算して和を求め続ける
  3. 最後に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アルゴリズム - Wikipediaphpコードサンプルリンクが切れていたので書きました