首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个ISBN-10校验和计算在php中正确吗?

这个ISBN-10校验和计算在php中正确吗?
EN

Stack Overflow用户
提问于 2018-07-20 08:14:38
回答 4查看 1.3K关注 0票数 0

我找到了一个PHP脚本github ISBN-Calc例程来执行ISBN-10校验和计算:

代码语言:javascript
复制
<?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,我用这个github脚本获得了Checksum: 0

根据ISBN在线检查器,校验和应该是4,就像在ISBN中一样。这里有人能给我提供正确的PHP例程吗?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-04-19 14:50:56

先前标记的答案接近但不完整。

具体而言,这一部分:

代码语言:javascript
复制
$check = 11 - ($sum % 11); // This can output 1,2,3,4,5,6,7,8,9,10,11 not 0
return ($check === 10) ? 'X' : $check; // This is incomplete does not address 11

代码不处理11-0= 11的情况,我试图在下面对其进行澄清。

代码语言:javascript
复制
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);

  // $check may hold either 10 or 11, but not 0
  // 10 becomes X, 11 becomes 0 -- output is 1 character only
  if ($check == 10)
  {
    $check = 'X';
  }
  elseif ($check == 11)
  {
    $check = '0';
  }

  return $check;
}

前面的答案失败的ISBN示例是0134093410。

票数 1
EN

Stack Overflow用户

发布于 2018-07-20 09:02:30

该函数用于计算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中这样建模:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-07-20 09:00:14

有一个来自GitHubhttps://github.com/Fale/isbn的库

有一个叫做"Check"的函数

Initialization:

代码语言:javascript
复制
$isbn = new Isbn\Isbn();

检查值:(示例)

代码语言:javascript
复制
$isbn->check->is10('888183718'); // Will return false
$isbn->check->is13('9788889527191'); // Will return true
$isbn->check->is13('978888952719'); // Will return false

您可以从给定的链接下载库。

也许这能帮点忙。

祝你周末愉快!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51438038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档