ISBN
コードなにがし::ISBN10桁13桁変換
そいや前それっぽいコード書いた記憶があったので探してみたところ発見。
ループを使いたくなくてcreate_function使ったりしてるあたり中二病。
/**
* @see http://seclan.dll.jp/ccisbn.htm
*/
/**
* assert(checkISBN('4575831778'))
*/
function checkISBN($code)
{
$code = str_replace('-', '', $code);
if (!preg_match('/^\d{9}[0-9X]$/', $code)) {
// japan /^4\d{8}[0-9X]$/
return false;
}
$code_array = str_split(substr($code, 0, 9));
array_walk($code_array, create_function('&$v,$k', '$v *= 10 - $k;'));
$check_digit = 11 - array_sum($code_array) % 11;
if ($code{9} != (($check_digit == 10)? 'X': $check_digit)) {
return false;
}
return true;
}
/**
* assert(checkEAN('978-4575831771'))
*/
function checkEAN($code)
{
$code = str_replace('-', '', $code);
if (!preg_match('/^\d{13}$/', $code)) {
// japan /^9784\d{8}[0-9A-Z]$/
return false;
}
$code_array = str_split(substr($code, 0, 12));
array_walk($code_array, create_function('&$v,$k', '$v *= (($k + 1) % 2)? 1: 3;'));
$check_digit = 10 - array_sum($code_array) % 10;
if ($code{12} != $check_digit) {
return false;
}
return true;
}