[PHP] ISBN(国際標準図書番号)の13桁→10桁、10桁→13桁の変換プログラムを作ってみた

このエントリーをはてなブックマークに追加

こんにちは、fujinyoです。
ISBN(国際標準図書番号)というのがあります。

世界共通で書籍を特定する番号なのですが、現在10桁と13桁があります。
13桁は2007年から完全施行になったのですが、こいつを相互に変換できるプログラムを作ってみました。

13桁を10桁に変換する
Libraries are CreepyLibraries are Creepy / Paul Lowry

まずは、13桁から10桁へ変換する isbn13to10 です。

/**
 * 13桁ISBNを10桁ISBNに変換する
 * @param type $value 13桁ISBN
 * @return 10桁ISBNもしくはnull
 */
function isbn13to10($value)
{
	$calc = 0;
	
	//ハイフンを置換
	$value = str_replace("-", "", $value);
	
	if(ctype_digit($value) && strlen($value) == 13)
	{
		//最初の3桁と最後の数値(チェックディジット)を削除
		$value = substr($value, 3, -1);
		
		for($i = 0, $j = 10; $i < 9; $i++, $j--)
		{
			$calc += $value[$i] * $j;
		}
		
		//余りの算出
		$remainder = $calc % 11;
		
		//チェックディジットの算出
		$checkDigit = 11 - $remainder;
		if($checkDigit == 10)
		{
			$checkDigit = "X";
		}
		else if($checkDigit == 11)
		{
			$checkDigit = 0;
		}

		//チェックディジットを最後に付加する
		$isbn = $value.$checkDigit;
	}
	else
	{
		//$valueが数値以外、13桁以外です
		$isbn = null;
	}
	
	return $isbn;
}
10桁を13桁に変換する
El Atena Grand Splendid Bookshop, Recoleta, Buenos Aires, Argentina, 28th. Dec. 2010El Atena Grand Splendid Bookshop, Recoleta, Buenos Aires, Argentina, 28th. Dec. 2010 / PhillipC

次に、10桁から13桁へ変換する isbn10to13 です。

/**
 * 10桁ISBNを13桁ISBNに変換する
 * @param type $value 10桁ISBN
 * @return null 13桁ISBNもしくはnull
 */
function isbn10to13($value)
{
	$calcArray = array("odd" => 0, "even" => 0);
	
	//ハイフンを置換
	$value = str_replace("-", "", $value);
	
	if(strlen($value) == 10)
	{
		//最後の数値(チェックデジット)を削除
		$value = substr($value, 0, -1);
		
		//先頭に978を付加する
		$value = "978".$value;
		
		for($i = 0; $i < 12; $i++)
		{
			if(($i+1) % 2)
			{
				//奇数
				$calcArray['odd'] += $value[$i];
			}
			else
			{
				//偶数
				$calcArray['even'] += $value[$i];
			}
		}
		
		//各桁に重みを掛ける
		$oddNum = $calcArray['odd'] * 1;
		$evenNum = $calcArray['even'] * 3;
		
		//余りの算出
		$remainder = ($oddNum + $evenNum) % 10;
		
		//チェックディジットの算出
		if($remainder != 0)
		{
			$checkDigit = 10 - $remainder;
		}
		else
		{
			$checkDigit = $remainder;
		}
		
		//チェックディジットを最後に付加する
		$isbn = $value.$checkDigit;
	}
	else
	{
		//$valueが数値以外、10桁以外です
		$isbn = null;
	}
	
	return $isbn;
}
最後に

コードは自由に使っていただいて構いませんが、自己責任でお願いします。
「おかしいよ!」とか「バグありますやん(笑」って時はコメントで教えてくれると嬉しいです。

関数を2つに分けましたが、10桁13桁どちらを入力しても変換できるような関数を作ると楽ですね。

ちなみに、13桁へ変換する際に “978” を付与していますが、書籍の数が増えて978番を使い切ったら979番が使われるようです。これはどういう決まりで10桁から変換できるようになるのかな?調べないといけないですね。

では、また。

参考 : ISBN-10 の検査文字の計算方法
参考 : ISBN-13 の検査文字の計算方法

[PR] 「結さん」があなたに代わって開発案件の依頼主を探します

  • 「既存のクライアントにギャラアップは言いにくい」
  • 「営業活動する時間がないし、苦手」
  • 「仕事が途切れたらどうしよう」

ITエンジニアのこんな悩みを「結さん」が解決してくれます
結さんへの無料会員登録後は提案メールを待つだけです!

関連記事

このエントリーをはてなブックマークに追加