3v4l.org

run code in 300+ PHP versions simultaneously
<?php class Number { /** * Assert if a number can be validate using Luhn Checksum * * Applies to : * Can be applid to : Siren, Siret, Credit card number, IMEI Number * Modulo can be overrided for custom control * simpleSum just sum all digits... * * @todo est-ce que l'on garde la somme simple au milieu de luhn... * * @param string|int $number * @param int $modulo * @param boolean $simpleSum * @return bool */ public static function assertLuhn($number, $modulo = 10, $simpleSum = false) { // Must be numeric and not a float if (!is_numeric($number) || is_float($number)) { return false; } // Begin Luhn Check $digits = array_reverse(str_split((string) $number)); $count = count($digits); $total = 0; for ($i = 0; $i < $count; ++$i) { if (($i + 1) % 2 !== 0 || $simpleSum) { $total += (int) $digits[$i]; } else { $total += array_sum(str_split((string) ((int) $digits[$i] * 2))); } } return $total % $modulo === 0; } /** * Assert if a number is a valid siren * * @param string|int $number * @return bool */ public static function assertSiren($number) { if (!self::assertLuhn($number)) { return false; } if (strlen($number) > 9 || strlen($number) < 5) { return false; } if (substr($number, 0, 5) === '00000') { return false; } return true; } /** * Assert if a number is a valid siren * * @param string|int $number * @return bool */ public static function assertSiret($number) { // @todo : extraction siren à mettre ailleurs $siren = substr($number, 0, 9); $modulo = 10; $simpleSum = false; // Le cas de "la poste", il y a plus de 10 000 etablissement, le modulo 10 ne fonctionne pas // Le modulo 5 est utilisé à la place // Sauf pour 35600000000048 qui est un siret validé avec luhn if ((int) $siren === 356000000 && (int) $number !== 35600000000048) { $modulo = 5; $simpleSum = true; } if (!self::assertSiren($siren) || !self::assertLuhn($number, $modulo, $simpleSum)) { return false; } if (strlen($number) > 14 || strlen($number) < 10) { return false; } return true; } } // (FR)?[0-9A-Z]{2}[0-9]{9} preg_match('/(FR)?[0-9A-Z]{2}[0-9]{9}/', 'FR 52 056800659', $matches); var_export(Number::assertSiret(str_replace(' ', '', '056 800 659 00155'))); var_export($matches);

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.60.0040.01218.65
8.3.50.0040.01118.12
8.3.40.0120.00319.04
8.3.30.0120.00419.05
8.3.20.0030.00618.88
8.3.10.0000.00923.65
8.3.00.0080.00020.61
8.2.180.0150.00018.34
8.2.170.0040.01819.08
8.2.160.0120.00322.96
8.2.150.0040.00424.18
8.2.140.0040.00424.66
8.2.130.0050.00320.07
8.2.120.0040.00426.35
8.2.110.0050.00522.37
8.2.100.0090.00318.22
8.2.90.0060.00318.13
8.2.80.0040.00417.97
8.2.70.0040.00418.17
8.2.60.0080.00018.16
8.2.50.0040.00418.10
8.2.40.0000.00819.42
8.2.30.0040.00419.50
8.2.20.0000.00818.12
8.2.10.0040.00418.13
8.2.00.0110.00017.93
8.1.280.0130.01025.92
8.1.270.0060.00319.13
8.1.260.0040.00426.35
8.1.250.0000.00828.09
8.1.240.0100.00723.87
8.1.230.0070.00718.02
8.1.220.0060.00317.91
8.1.210.0000.00818.77
8.1.200.0060.00317.60
8.1.190.0030.00517.48
8.1.180.0030.00518.10
8.1.170.0000.00818.89
8.1.160.0060.00318.93
8.1.150.0050.00318.90
8.1.140.0050.00222.23
8.1.130.0110.00020.24
8.1.120.0000.00817.70
8.1.110.0000.00817.68
8.1.100.0080.00017.68
8.1.90.0040.00417.57
8.1.80.0000.00717.65
8.1.70.0000.00717.56
8.1.60.0040.00417.68
8.1.50.0040.00417.71
8.1.40.0040.00417.72
8.1.30.0040.00417.76
8.1.20.0030.00617.91
8.1.10.0000.00717.76
8.1.00.0030.00617.74
8.0.300.0070.00018.77
8.0.290.0030.00616.88
8.0.280.0070.00018.53
8.0.270.0040.00417.35
8.0.260.0030.00318.52
8.0.250.0050.00517.18
8.0.240.0030.00717.10
8.0.230.0070.00017.16
8.0.220.0030.00317.10
8.0.210.0040.00417.11
8.0.200.0000.00717.15
8.0.190.0040.00417.20
8.0.180.0040.00416.96
8.0.170.0030.00617.10
8.0.160.0050.00217.14
8.0.150.0040.00416.95
8.0.140.0070.00016.98
8.0.130.0000.00613.54
8.0.120.0000.00817.11
8.0.110.0050.00217.10
8.0.100.0040.00417.05
8.0.90.0000.00817.05
8.0.80.0060.01117.02
8.0.70.0000.00817.12
8.0.60.0040.00416.94
8.0.50.0030.00517.06
8.0.30.0100.00817.36
8.0.20.0040.01417.40
8.0.10.0040.00417.29
8.0.00.0120.00917.02
7.4.330.0000.00515.55
7.4.320.0000.00616.77
7.4.300.0030.00316.89
7.4.290.0030.00316.87
7.4.280.0030.00616.71
7.4.270.0080.00316.89
7.4.260.0040.00416.79
7.4.250.0030.00616.81
7.4.240.0060.00316.69
7.4.230.0000.00716.69
7.4.220.0000.00816.66
7.4.210.0090.00816.83
7.4.200.0000.00716.64
7.4.160.0120.00616.79
7.4.140.0120.00817.86
7.4.130.0090.00916.83
7.4.120.0120.00816.86
7.4.110.0070.01716.61
7.4.100.0070.01016.80
7.4.90.0030.01316.73
7.4.80.0120.00919.39
7.4.70.0140.00616.86
7.4.60.0110.01116.60
7.4.50.0070.00716.96
7.4.40.0070.01016.88
7.3.330.0000.00513.42
7.3.320.0000.00713.51
7.3.310.0060.00316.65
7.3.300.0000.00716.45
7.3.290.0000.00716.58
7.3.280.0100.01016.56
7.3.260.0100.00916.78
7.3.240.0130.00716.61
7.3.230.0060.01516.66
7.3.210.0150.00916.82
7.3.200.0130.00316.92
7.3.190.0090.00916.65
7.3.180.0140.00316.90
7.3.170.0090.00916.68
7.3.160.0060.01616.85
7.2.330.0120.00616.87
7.2.320.0110.00716.88
7.2.310.0120.00617.07
7.2.300.0070.01017.03
7.2.290.0110.00716.84

preferences:
49.54 ms | 400 KiB | 5 Q