Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】JSON_NUMERIC_CHECK定数の使い方

JSON_NUMERIC_CHECK定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

JSON_NUMERIC_CHECK定数は、PHPのjson_encode()関数が、配列やオブジェクト内の数値形式の文字列をJSONの数値型としてエンコードするかどうかを制御するための定数です。

通常、PHPでは、例えば"123"のように数値に見える文字列は、json_encode()によってJSON出力でも文字列として扱われます。しかし、このJSON_NUMERIC_CHECK定数をjson_encode()関数のオプションとして指定すると、そのような数値形式の文字列は、JSON出力時には自動的に123のような数値型に変換されます。

この機能は、特にWebアプリケーション開発において非常に役立ちます。例えば、データベースから取得したデータが、実際には数値であるにもかかわらずPHPの内部で文字列型として扱われているケースがあります。このようなデータをJSONとしてクライアントサイドに送信する際、JavaScriptなどの言語では厳密な型チェックが行われることが多いため、数値が文字列として渡されると予期せぬ問題が発生したり、追加の型変換処理が必要になったりする可能性があります。JSON_NUMERIC_CHECKを利用することで、このような型の不整合を事前に解消し、JSONデータの互換性と処理の効率を高めることができます。

ただし、すべての数値形式の文字列に対してこの定数を適用することが適切とは限りません。例えば、郵便番号や電話番号のように、先頭にゼロが付く文字列(例: "0123")が数値として変換されると、そのゼロが失われ(123となる)、データの意味が失われる可能性があります。そのため、利用する際にはデータの特性を十分に理解し、純粋な数値として扱われても問題ない場合に限定して使用することが推奨されます。この定数はPHP 5.3.3以降で利用可能です。

構文(syntax)

1<?php
2$data = ['id' => '123', 'amount' => '45.67'];
3$json_string = json_encode($data, JSON_NUMERIC_CHECK);
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

JSON_NUMERIC_CHECKは、json_encode() 関数で使用される定数で、整数や浮動小数点数を数値としてエンコードするかどうかを制御するために使われます。この定数を指定すると、数値としてエンコードできる文字列は数値型として出力されます。

サンプルコード

PHP: json_encode で JSON_NUMERIC_CHECK を使う

1<?php
2
3/**
4 * JSON_NUMERIC_CHECK 定数の使用例を示します。
5 *
6 * この定数は json_encode() 関数のオプションとして使用され、
7 * 配列やオブジェクトの値が数値に見える文字列である場合に、
8 * それらをJSONの数値型としてエンコードするかどうかを制御します。
9 */
10function demonstrateJsonNumericCheck(): void
11{
12    // 数値に見える文字列を含むサンプルデータ
13    $data = [
14        'productId' => '12345',      // 数値に見える文字列
15        'quantity' => '100',         // 数値に見える文字列
16        'itemCode' => 'ITEM-A001',   // 数値ではない文字列
17        'price' => 29.99,
18        'active' => true,
19        'details' => [
20            'weight' => '5.5',       // 入れ子内の数値に見える文字列
21            'unit' => 'kg'
22        ]
23    ];
24
25    echo "--- JSON_NUMERIC_CHECK オプションなしの場合 ---\n";
26    // デフォルトの挙動。数値に見える文字列もそのまま文字列としてエンコードされます。
27    // JSON_PRETTY_PRINT は可読性を高めるためのオプションです。
28    $jsonWithoutNumericCheck = json_encode($data, JSON_PRETTY_PRINT);
29    if ($jsonWithoutNumericCheck === false) {
30        echo "JSON エンコードエラー: " . json_last_error_msg() . "\n";
31        return;
32    }
33    echo $jsonWithoutNumericCheck . "\n\n";
34
35    echo "--- JSON_NUMERIC_CHECK オプションありの場合 ---\n";
36    // JSON_NUMERIC_CHECK を指定すると、数値に見える文字列がJSONの数値型に変換されます。
37    // 例: "12345" => 12345, "5.5" => 5.5
38    $jsonWithNumericCheck = json_encode($data, JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK);
39    if ($jsonWithNumericCheck === false) {
40        echo "JSON エンコードエラー: " . json_last_error_msg() . "\n";
41        return;
42    }
43    echo $jsonWithNumericCheck . "\n";
44}
45
46// サンプルコードを実行します。
47demonstrateJsonNumericCheck();
48

PHPのJSON_NUMERIC_CHECKは、json_encode()関数でPHPのデータ(配列やオブジェクト)をJSON形式の文字列に変換する際に使用できる定数です。この定数自体は整数値を持っており、json_encode()の第二引数(オプション)として指定することで機能が有効になります。

JSON_NUMERIC_CHECKの主な役割は、PHPのデータ内で「数値に見える文字列」がある場合に、それらをJSONの数値型としてエンコードするかどうかを制御することです。通常、json_encode()はPHPの文字列をそのままJSONの文字列として出力します。例えば、PHPの'12345'はJSONでは"12345"となります。

しかし、json_encode()JSON_NUMERIC_CHECKオプションを指定すると、'12345''5.5'のように数値として解釈できる文字列は、JSONの数値型(例: 123455.5)に自動的に変換されます。一方、'ITEM-A001'のような数値ではない文字列は、変換されずにJSONの文字列として維持されます。この機能は、JSONデータを受け取るシステムで特定の値を数値型として扱いたい場合に、データの整合性を保ち、クライアント側での型変換の手間を省くのに役立ちます。

JSON_NUMERIC_CHECKは、数値として認識できる文字列をJSONの数値型に自動変換するオプションです。例えば「123」という文字列が123という数値になります。この変換は、完全に数値形式の文字列にのみ適用され、「ITEM-A001」のような文字を含む文字列には影響しません。しかし、データベースのIDなど、文字列として扱いたい識別子が数値型に変換されてしまうと、桁数の問題や先頭のゼロが失われるなど、後続の処理で意図しない挙動を引き起こす可能性があります。そのため、このオプションを使用する際は、エンコードされるデータが本当に数値として扱われても問題ないか、連携先のシステムで問題が発生しないかを十分に確認してください。また、json_encode関数は処理が失敗する可能性があるため、常に戻り値がfalseでないかを確認し、json_last_error_msg()でエラー情報を取得する実装を心がけましょう。

関連コンテンツ