Оказывается номер пластиковой карты вовсе не случаен. Для нумерации используется алгоритм Луна (Luhn algorithm). Нужен он для проверки правильности номера.
<?php function is_valid_credit_card($s) { // оставить только цифры $s = strrev(preg_replace('/[^\d]/','',$s)); // вычисление контрольной суммы $sum = 0; for ($i = 0, $j = strlen($s); $i < $j; $i++) { // использовать четные цифры как есть if (($i % 2) == 0) { $val = $s[$i]; } else { // удвоить нечетные цифры и вычесть 9, если они больше 9 $val = $s[$i] * 2; if ($val > 9) $val -= 9; } $sum += $val; } // число корректно, если сумма равна 10 return (($sum % 10) == 0); } if (! is_valid_credit_card('4111 1111 1111 1234')) { echo 'ошибка в номере'; } ?>
Однако номер 4111 1111 1111 1111 хоть и проходит проверку, но не является правильным. Так как этот номер используется в рекламных целях и в качестве примеров.
17.12.2011
у вас ошибка, действия с четными и нечетными цифрами карты необходимо производить противоположные:
// использовать НЕЧЕТНЫЕ цифры как есть
// удвоить ЧЕТНЫЕ цифры и вычесть 9, если они больше 9