это правильное вычисление контрольной суммы ISBN-10 в php правильно?

Я нашел скрипт 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, пожалуйста?

Спасибо

0

Решение

Эта функция предназначена для вычисления контрольной цифры 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

2

Другие решения

Есть библиотека из 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

Вы можете скачать библиотеку по данной ссылке.

Может быть, это немного помогает.

Хороших выходных!

-1

Если вы хотите проверить правильность 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 за правду

демонстрация

https://eval.in/1053913

-1
По вопросам рекламы [email protected]