---
slug: "jan-checkdigit-validation-php-code"
title: "PHPでJANコードのチェックデジットをバリデーションするコード"
description: "渡されたJANコードが有効かどうかを確認し、有効であれば真を返し、無効であれば偽とエラーメッセージを返すPHPの関数です。"
url: "https://www.ytyng.com/blog/jan-checkdigit-validation-php-code"
publish_date: "2023-04-01T02:27:15Z"
created: "2023-04-01T02:27:15Z"
updated: "2026-02-27T12:05:16.893Z"
categories: ["PHP"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20250708/edb8f91437a8434b8c3f864258ae01c3.png.webp?width=768"
has_video: true
has_music: true
video_urls: ["https://media.ytyng.net/ytyng-blog/278/featured-video-1.mp4", "https://media.ytyng.net/ytyng-blog/278/featured-video-2.mp4", "https://media.ytyng.net/ytyng-blog/278/featured-video-3.mp4"]
music_urls: ["https://media.ytyng.net/ytyng-blog/278/featured-music-278-3.mp3", "https://media.ytyng.net/ytyng-blog/278/featured-music-278-4.mp3"]
lang: "ja"
---

# PHPでJANコードのチェックデジットをバリデーションするコード

```php
/**
 * JANのチェックデジットを検証し、[成功?, メッセージ] を返す
 */
function validate_jan($jan): array
{
    $match = preg_match('|^(\d{12})(\d)$|', $jan, $matches);
    if (!$match) {
        return [false, '桁数エラー'];
    }
    $chars = str_split($matches[1]);
    $odd_total = 0;
    $even_total = 0;
    foreach ($chars as $i => $v) {
        if ($i % 2 == 0) {
            // 0スタートなので0は奇数桁
            $odd_total += $v;
        } else {
            $even_total += $v;
        }
    }
    $total = $even_total * 3 + $odd_total;
    $digit = (10 - ($total % 10)) % 10;
    if ($matches[2] != $digit) {
        return [false, "チェックディジットが不一致。本来は {$digit}"];
    }
    return [true, ""];
}
```
