Short decision
You can use this (witchcraft!) Solution and just check the string length:
function is_luhn($n) {
$str = '';
foreach (str_split(strrev((string) $n)) as $i => $d) {
$str .= $i %2 !== 0 ? $d * 2 : $d;
}
return array_sum(str_split($str)) % 10 === 0;
}
function is_imei($n){
return is_luhn($n) && strlen($n) == 15;
}
Detailed solution
Here is my original function that explains each step:
function is_imei($imei){
if(strlen($imei) != 15 || !ctype_digit($imei))
return false;
$digits = str_split($imei);
$imei_last = array_pop($digits);
$log = array();
foreach($digits as $key => $n){
if($key & 1){
$double = str_split($n * 2);
$n = array_sum($double);
}
$log[] = $n;
}
$sum = array_sum($log) * 9;
return substr($sum, -1) == $imei_last;
}