prova a confrontare con questa soluzione:

Codice PHP:

function is_luhn_valid($str) {   
 if (
strspn($str"0123456789") != strlen($str)) {
       return 
false
 }    
 
$map = array(0123456789,       
                    
0246813579);  
 
$sum 0;    
 
$last strlen($str) - 1;   
 for (
$i 0$i <= $last$i++) {       
 
$sum += $map[$str[$last $i] + ($i 1) * 10];   
 }    
 return 
$sum 10 == 0