Я нашел скрипт PHP Github ISBN-Calc Рутин для расчета контрольной суммы ISBN-10:
<?php
/**
* Calculate ISBN checksum
*
* @param string $isbn
* @return integer
*/
function isbn_checksum($isbn) {
$sum = 0; $isbn = str_split(preg_replace('/[^\d]/', '', $isbn));
foreach($isbn as $key => $z) {
if($key >= 12) break;
$sum += ($key % 2) ? $z * 3 : $z;
}
$checksum = (10 - $sum % 10);
return ($checksum == 10) ? 0 : $checksum;
}
Но для моего ISBN-10: 0470173424
я получил Checksum: 0
с этим скриптом GitHub.
В соответствии с ISBN онлайн-чекер контрольная сумма должна быть 4, как в ISBN. Может ли кто-нибудь здесь предоставить мне правильную процедуру PHP, пожалуйста?
Спасибо
Эта функция предназначена для вычисления контрольной цифры ISBN-13, а не ISBN-10 — поэтому она прерывает цикл после 12-го символа.
Алгоритм ISBN-10 отличается и требует умножения первых 9 цифр числа на 10 до 2. Разница между этой суммой и следующим кратным 11 является контрольной цифрой. Для вашего примера это будет:
(10 * 0) +
(9 * 4) +
(8 * 7) +
(7 * 0) +
(6 * 1) +
(5 * 7) +
(4 * 3) +
(3 * 4) +
(2 * 2) = 161.
Следующий кратный 11 — 165, поэтому контрольная цифра должна быть 4 (как вы говорите). В случае, когда контрольная цифра будет 10, используется X. Мы можем смоделировать это в PHP следующим образом:
function isbn10($isbn) {
$isbn = preg_replace('/[^\d]/', '', $isbn);
$digits = str_split(substr($isbn, 0, 9));
$sum = 0;
foreach ($digits as $index => $digit) {
$sum += (10 - $index) * $digit;
}
$check = 11 - ($sum % 11);
return ($check === 10) ? 'X' : $check;
}
echo isbn10('047017342');
4
Вы можете увидеть это работает здесь: https://eval.in/1039654
Есть библиотека из GitHub: https://github.com/Fale/isbn
Есть функция под названием «Проверьте»:
Инициализация:
$isbn = new Isbn\Isbn();
Проверьте значения: (Пример)
$isbn->check->is10('888183718'); // Will return false
$isbn->check->is13('9788889527191'); // Will return true
$isbn->check->is13('978888952719'); // Will return false
Вы можете скачать библиотеку по данной ссылке.
Может быть, это немного помогает.
Хороших выходных!
Если вы хотите проверить правильность ISBN-10
Утвердить ISBN-10
<?php
function isValidIsbn10($isbn) {
$check = 0;
for ($i = 0; $i < 10; $i++) {
if ('x' === strtolower($isbn[$i])) {
$check += 10 * (10 - $i);
} elseif (is_numeric($isbn[$i])) {
$check += (int)$isbn[$i] * (10 - $i);
} else {
return false;
}
}
return (0 === ($check % 11)) ? 1 : false;
}
var_dump( isValidIsbn10('0470173424') );
Источник: https://stackoverflow.com/a/14096142/5201919
Покажет
1 за правду
демонстрация