Skip to content

Instantly share code, notes, and snippets.

@denstream-io
Created March 11, 2023 06:02
Show Gist options
  • Save denstream-io/9669bf20b71c2d3c0ad62fa201469b12 to your computer and use it in GitHub Desktop.
Save denstream-io/9669bf20b71c2d3c0ad62fa201469b12 to your computer and use it in GitHub Desktop.
Credit with PHP #CS50X Harvard
<?php
function main() {
$len = 0;
$divisor = 10;
$ccn;
// Query user for card details
do
{
$ccn = (int)readline("Enter Card Number: ");
}
while ($ccn < 0);
$cardNumber = $ccn;
// Computing credit card length
while($cardNumber != 0)
{
$cardNumber = intdiv($cardNumber, 10);
$len++;
}
$cardNumber = $ccn;
// luhns Algorithm
$sum = 0;
for ($i = 1; $i <= $len; $i++)
{
$digit = $cardNumber % 10;
if ($i % 2 == 0)
{
if ($digit * 2 > 9)
{
$sum += $digit * 2 - 9;
}
else
{
$sum += $digit * 2;
}
}
else
{
$sum += $digit;
}
$cardNumber = intdiv($cardNumber, 10);
}
for ($j = 0; $j < $len - 2; $j++)
{
$divisor = $divisor * 10;
}
$cardNumber = $ccn; // prevents exhausting original card number in loop
$firstDigit = intdiv($cardNumber, $divisor);
// Reduces divisor by 10
$divisor = round($divisor / 10); // Proper division - like C
$firstTwoDigits = intdiv($cardNumber, $divisor);
if ($sum % 10 == 0)
{
if ($len == 15 && ($firstTwoDigits == 34 || $firstTwoDigits == 37))
{
printf("AMEX\n");
}
else if ($len == 16 && ($firstTwoDigits > 50 && $firstTwoDigits < 56))
{
printf("MASTERCARD\n");
}
else if (($len == 19 || $len == 13 || $len == 16) && ($firstDigit == 4))
{
printf("VISA\n");
}
else
{
printf("INVALID\n");
}
}
else
{
printf("INVALID\n");
}
}
// Run Main
main()
?>
@denstream-io
Copy link
Author

#PHPforLife

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment