なかったので作りました。
自己責任でお使いください
class gs1 {
function gs1tojan($gs1) {
//すべて半角数字または()であるかをチェック
if (preg_match("/^[0-9()]+$/", $gs1))
//最初の桁のインジケーターを判断
if(mb_strlen($gs1)==18){
if (strpos($gs1, '(010)') === 0|strpos($gs1, '(01)0') === 0) {
$janNoCheckDigit=mb_substr($gs1, 5, 12);
return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
}
}else if(mb_strlen($gs1)==17){
if (strpos($gs1, '(01)') === 0) {
$janNoCheckDigit=mb_substr($gs1, 4, 12);
return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
}
}else if(mb_strlen($gs1)==16){
if (strpos($gs1, '010') === 0) {
$janNoCheckDigit=mb_substr($gs1, 3, 12);
return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
}
}else if(mb_strlen($gs1)==15){
if (strpos($gs1, '01') === 0) {
$janNoCheckDigit=mb_substr($gs1, 2, 12);
return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
}
}else if(mb_strlen($gs1)==14){
if (strpos($gs1, '1') === 0) {
$janNoCheckDigit=mb_substr($gs1, 1, 12);
return $janNoCheckDigit.gs1::calcJanCodeDigit($janNoCheckDigit);
}
}
}
return false;
}
function calcJanCodeDigit($num) {
$arr = str_split($num);
$odd = 0;
$mod = 0;
for($i=0;$i<count($arr);$i++){
if(($i+1) % 2 == 0) {
//偶数の総和
$mod += intval($arr[$i]);
} else {
//奇数の総和
$odd += intval($arr[$i]);
}
}
//偶数の和を3倍+奇数の総和を加算して、下1桁の数字を10から引く
$cd = 10 - intval(substr((string)($mod * 3) + $odd,-1));
//10なら1の位は0なので、0を返す。
return $cd === 10 ? 0 : $cd;
}
}

