【PHP8.x】strcmp関数の使い方

作成日: 更新日:

strcmp関数は、2つの文字列をバイナリセーフな方法で比較する関数です。この関数は、与えられた2つの文字列が同じであるか、あるいはどちらが辞書順で先に来るか、後になるかを判断するために使用されます。バイナリセーフとは、文字列の内容をバイト単位で正確に比較することを意味し、文字エンコーディングの違いによる誤った比較結果を防ぎます。

比較の結果は整数値で返されます。もし最初の文字列と2番目の文字列が完全に一致する場合は0が返されます。最初の文字列が2番目の文字列よりも辞書順で小さい場合は負の整数が、大きい場合は正の整数がそれぞれ返されます。この関数による比較では、大文字と小文字は区別されます(ケースセンシティブ)ので、「PHP」と「php」は異なる文字列として扱われます。

strcmp関数は、特に文字列の内容を厳密に比較したい場合に非常に有用です。例えば、ユーザーが入力した値と既存の値を完全に一致させる必要がある場合や、ファイル名、パスワードなどの機密性の高い情報を比較する際にその真価を発揮します。PHPには==演算子による文字列比較も存在しますが、これは場合によっては型変換を伴うため、数値と文字列の比較などで予期せぬ結果を生む可能性があります。一方でstrcmp関数は、常に文字列そのものの値を厳密に比較するため、より安全で正確な比較が必要な場面で選択されるべきです。これにより、プログラムの意図しない挙動を防ぎ、信頼性の高いシステムを構築することに役立ちます。

基本的な使い方

構文(syntax)

<?php
$string1 = "stringA";
$string2 = "stringB";

$comparisonResult = strcmp($string1, $string2); // 2つの文字列をバイナリセーフな方法で比較します
?>

引数(parameters)

string $string1, string $string2

  • string $string1: 比較対象となる1つ目の文字列
  • string $string2: 比較対象となる2つ目の文字列

戻り値(return)

int

strcmp関数は、2つの文字列を比較し、その結果を整数で返します。返される整数は、文字列の比較結果に応じて異なります。

サンプルコード

PHP: 文字列の「case insensitive」比較を行う

<?php

/**
 * 大文字と小文字を区別せずに文字列を比較する方法を示します。
 *
 * `strcmp()` は大文字と小文字を区別します (case-sensitive)。
 * 大文字と小文字を区別しない (case-insensitive) 比較を行うには、
 * `strcasecmp()` 関数を使用するのが一般的です。
 * このサンプルでは、両方の関数の違いを明確に示します。
 *
 * @return void
 */
function compareStringsCaseInsensitive(): void
{
    $string1 = 'Hello World';
    $string2 = 'hello world';

    // strcmp() は大文字と小文字を区別するため、結果は 0 (等しい) になりません。
    $resultSensitive = strcmp($string1, $string2);
    echo "strcmp() の結果 (大文字/小文字を区別):" . PHP_EOL;
    if ($resultSensitive === 0) {
        echo "  '{$string1}' と '{$string2}' は等しいです。" . PHP_EOL;
    } else {
        echo "  '{$string1}' と '{$string2}' は等しくありません。(返り値: {$resultSensitive})" . PHP_EOL;
    }

    echo PHP_EOL;

    // strcasecmp() は大文字と小文字を区別しないため、結果は 0 (等しい) になります。
    // この関数がキーワード「case insensitive」に最も関連します。
    $resultInsensitive = strcasecmp($string1, $string2);
    echo "strcasecmp() の結果 (大文字/小文字を区別しない):" . PHP_EOL;
    if ($resultInsensitive === 0) {
        echo "  '{$string1}' と '{$string2}' は等しいです。(返り値: {$resultInsensitive})" . PHP_EOL;
    } else {
        echo "  '{$string1}' と '{$string2}' は等しくありません。" . PHP_EOL;
    }
}

// 関数を実行して比較結果を表示します。
compareStringsCaseInsensitive();

PHPのstrcmp()関数は、2つの文字列を引数として受け取り、それらをバイト単位で比較します。この比較では大文字と小文字が厳密に区別されます。

戻り値は整数(int型)で、2つの文字列の関係性を示します。第1引数の文字列が第2引数の文字列と完全に一致する場合は0を返します。第1引数が辞書順で小さい場合は負の数を、大きい場合は正の数を返します。

このサンプルコードでは、まずstrcmp()を使って'Hello World''hello world'を比較しています。大文字と小文字が異なるため、これらは等しくないと判断され、0以外の結果が返されます。

次に、キーワードである「大文字と小文字を区別しない(case-insensitive)」比較を実現するために、strcasecmp()関数を使用しています。この関数はstrcmp()と機能は似ていますが、比較の際に大文字と小文字の違いを無視します。そのため、'Hello World''hello world'は等しいと見なされ、戻り値として0が返されます。このように、厳密な比較にはstrcmp()を、大文字・小文字を問わない比較にはstrcasecmp()を使い分けることが重要です。

strcmp関数は、文字列の大文字と小文字を厳密に区別して比較することにご注意ください。そのため、「Hello World」と「hello world」のように、見た目が似ていても大文字小文字が異なる場合は、関数は文字列を「等しくない」と判断します。もし、大文字と小文字を区別せずに比較したい場合は、strcasecmp関数を使用するのが適切です。これはキーワードである「case insensitive」の要件を満たします。これらの関数は、文字列が完全に一致する場合にのみ0を返します。それ以外の戻り値は、文字列の辞書的な順序(大小関係)を示していますので、0以外の値で単純に「不一致」と判断するだけでなく、その意味も理解しておくと良いでしょう。利用目的に応じて適切な関数を選択することが、コードを安全かつ正確に利用する上で非常に重要です。

PHP strcmp関数で文字列を比較する

<?php

declare(strict_types=1);

/**
 * strcmp() 関数の使用例を示します。
 *
 * strcmp() は、2つの文字列を大文字と小文字を区別して比較します。
 * - 戻り値が 0 の場合: 2つの文字列は等しい
 * - 戻り値が 0 より小さい場合: 最初の文字列が2番目の文字列より小さい
 * - 戻り値が 0 より大きい場合: 最初の文字列が2番目の文字列より大きい
 * 
 * この比較は、文字コードの順序に基づいて行われます(バイナリセーフ)。
 */
function demonstrateStrcmp(): void
{
    // ケース1: 2つの文字列が完全に一致する場合
    $string1 = 'hello world';
    $string2 = 'hello world';
    $result1 = strcmp($string1, $string2);
    echo "比較1: '{$string1}' vs '{$string2}'" . PHP_EOL;
    echo "結果: {$result1} (文字列は等しい)" . PHP_EOL . PHP_EOL;

    // ケース2: 最初の文字列が辞書順で前に来る場合
    $string3 = 'apple';
    $string4 = 'banana';
    $result2 = strcmp($string3, $string4);
    echo "比較2: '{$string3}' vs '{$string4}'" . PHP_EOL;
    echo "結果: {$result2} (最初の文字列が小さい)" . PHP_EOL . PHP_EOL;

    // ケース3: 最初の文字列が辞書順で後に来る場合
    $string5 = 'orange';
    $string6 = 'grape';
    $result3 = strcmp($string5, $string6);
    echo "比較3: '{$string5}' vs '{$string6}'" . PHP_EOL;
    echo "結果: {$result3} (最初の文字列が大きい)" . PHP_EOL . PHP_EOL;

    // ケース4: 大文字と小文字を比較する場合
    // ASCIIコードでは大文字 'H' は小文字 'h' より小さいため、負の値が返ります。
    $string7 = 'Hello';
    $string8 = 'hello';
    $result4 = strcmp($string7, $string8);
    echo "比較4: '{$string7}' vs '{$string8}'" . PHP_EOL;
    echo "結果: {$result4} (大文字は小文字より小さいと判断される)" . PHP_EOL;
}

// 関数を実行して、比較結果を画面に表示します
demonstrateStrcmp();

strcmp()は、2つの文字列を大文字と小文字を区別して比較するためのPHPの組み込み関数です。引数には、比較したい2つの文字列を渡します。この関数は、比較結果を整数値で返します。

戻り値が0の場合、2つの文字列は完全に等しいことを意味します。戻り値が0より小さい負の整数の場合、第1引数の文字列が第2引数の文字列よりも小さい(辞書順で手前にある)ことを示します。反対に、戻り値が0より大きい正の整数の場合、第1引数の文字列が大きい(辞書順で後にある)ことを示します。

この比較は、文字コードの順序に基づいて1文字ずつ行われます。そのため、大文字と小文字は異なる文字として扱われます。サンプルコードにあるように、'Hello'と'hello'を比較すると、文字コードでは大文字'H'が小文字'h'よりも小さいため、結果は負の値となります。このように、文字列の厳密な一致や並び順を確認したい場合に役立つ関数です。

strcmp関数は、戻り値が0の時に文字列が等しいと判断します。truefalseを返すわけではないため、if (strcmp($a, $b) === 0) のように、0と厳密に比較するのが安全な使い方です。この関数は文字のバイト値を比較するため、大文字と小文字を区別します。例えば'A'と'a'は異なる文字として扱われます。もし大文字と小文字を区別せずに比較したい場合は、代わりにstrcasecmp関数を使用してください。また、この関数は文字列の大小関係(ソート順)を調べるのに適していますが、単純に文字列が等しいかだけを確認したい場合は、===演算子を使う方がより高速で直感的です。

PHP strcmpで文字列が一致しないか確認する

<?php

/**
 * strcmp() を使用して2つの文字列を比較し、一致しない場合の処理を示します。
 *
 * strcmp() は、2つの文字列を辞書順で比較します。
 * - string1 が string2 より小さい場合: 負の整数
 * - string1 が string2 より大きい場合: 正の整数
 * - 両方が等しい場合: 0
 * を返します。
 *
 * @param string $stringA 比較する1つ目の文字列
 * @param string $stringB 比較する2つ目の文字列
 * @return void
 */
function checkStringDifference(string $stringA, string $stringB): void
{
    // strcmp() を使って文字列を比較します。
    $result = strcmp($stringA, $stringB);

    // 戻り値が 0 と等しくないか (not equal) をチェックします。
    // これが「文字列が一致しない」ことを判定する条件です。
    if ($result !== 0) {
        echo "「{$stringA}」と「{$stringB}」は一致しません。" . PHP_EOL;
        echo "strcmp() の戻り値: {$result}" . PHP_EOL;
    } else {
        echo "「{$stringA}」と「{$stringB}」は一致します。" . PHP_EOL;
        echo "strcmp() の戻り値: {$result}" . PHP_EOL;
    }

    echo "--------------------------" . PHP_EOL;
}

// ケース1: 一致しない (戻り値は負の数)
// 'apple' は 'banana' より辞書順で前にあります。
checkStringDifference('apple', 'banana');

// ケース2: 一致しない (戻り値は正の数)
// 'orange' は 'grape' より辞書順で後にあります。
checkStringDifference('orange', 'grape');

// ケース3: 一致する (比較用、戻り値は 0)
checkStringDifference('php', 'php');

?>

PHPのstrcmp関数は、2つの文字列を辞書順で比較するための関数です。この関数は、引数として比較したい2つの文字列($string1$string2)を受け取ります。比較の結果は整数値として戻り値で返されます。

具体的には、$string1$string2より辞書順で前にくる場合は負の整数を、$string1$string2より辞書順で後にくる場合は正の整数を返します。そして、2つの文字列が完全に同じである場合は0を返します。

そのため、「文字列が一致しない」ことを判定したい場合は、strcmp関数の戻り値が0ではないかどうかを確認します。

上記のサンプルコードでは、checkStringDifference関数がこのstrcmp関数の利用方法を示しています。例えば、'apple'と'banana'や'orange'と'grape'のように異なる文字列を比較した場合は、戻り値が0以外の値となり、「一致しません」という結果が出力されます。一方、'php'と'php'のように完全に一致する文字列を比較した場合は、戻り値が0となり、「一致します」と出力されることを確認できます。このように、strcmp関数は文字列の一致・不一致を効率的に判断する際に役立ちます。

strcmp()関数は、二つの文字列を辞書順に比較し、一致しない場合は 0 以外の整数、一致する場合は 0 を返します。サンプルコードのように「一致しない」ことを判定する際は、戻り値が 0 と等しくないか (!== 0) を確認するのが適切です。

特に注意すべき点は、この関数が大文字と小文字を厳密に区別する点です。例えば 'PHP''php' は異なる文字列として扱われます。大文字・小文字を区別しない比較を行いたい場合は、strcasecmp() 関数を使用してください。

また、'2''10' のような数値を含む文字列を比較する際も、strcmp() は文字列としての辞書順で比較するため、期待と異なる結果になることがあります。数値として比較したい場合は、事前に型変換を行うか、数値比較演算子 (>, < など) を使ってください。常に型厳密な比較 (!=====) を用いることで、意図しない型変換によるバグを防ぎ、より安全なコードになります。

PHP strcmp 日本語バイト比較する

<?php

declare(strict_types=1);

/**
 * strcmp() を使って日本語文字列を比較するサンプルコード。
 *
 * strcmp() は文字列をバイト単位で比較します。
 * そのため、文字コード(例: UTF-8)におけるバイト値の順序で比較され、
 * 必ずしも日本語の辞書順(あいうえお順)と一致するとは限りません。
 * このコードは、その動作を実証します。
 */
function demonstrateStrcmpWithJapanese(): void
{
    // 比較する2つの日本語文字列
    $hira = 'ひらがな';
    $kata = 'カタカナ';

    // strcmp() を使って比較
    $result = strcmp($hira, $kata);

    // --- 結果の表示 ---
    echo "比較対象1: '{$hira}'" . PHP_EOL;
    echo "比較対象2: '{$kata}'" . PHP_EOL;
    echo "strcmp() の戻り値: {$result}" . PHP_EOL;
    echo PHP_EOL;

    // 戻り値に基づいて、どちらの文字列が「大きい」か判断
    if ($result < 0) {
        echo "結果: '{$hira}' は '{$kata}' よりもバイト値が小さいです。" . PHP_EOL;
    } elseif ($result > 0) {
        echo "結果: '{$hira}' は '{$kata}' よりもバイト値が大きいです。" . PHP_EOL;
    } else {
        echo "結果: '{$hira}' と '{$kata}' はバイト値が等しいです。" . PHP_EOL;
    }

    echo PHP_EOL;
    echo "補足: 一般的な日本語の辞書順では「カタカナ」が「ひらがな」より先に来ますが、" . PHP_EOL;
    echo "UTF-8のバイト値では「ひらがな」の方が「カタカナ」より大きいため、このような結果になります。" . PHP_EOL;
    echo "日本語の辞書順で比較したい場合は、strcmp() ではなく mb_strcoll() などの使用を検討してください。" . PHP_EOL;
}

// 関数を実行して比較結果を表示します
demonstrateStrcmpWithJapanese();

strcmp関数は、2つの文字列を比較するために使用されるPHPの組み込み関数です。この関数は、引数として比較対象となる2つの文字列($string1, $string2)を受け取ります。そして、それらの文字列のバイト値を比較し、どちらの文字列が大きいかを示す整数値を戻り値として返します。具体的には、$string1$string2よりも小さい場合は負の数、大きい場合は正の数、両者が等しい場合は0を返します。

重要な点として、strcmp関数は文字列を「バイト単位」で比較します。そのため、日本語のようなマルチバイト文字を含む文字列を比較する際には注意が必要です。

サンプルコードでは、「ひらがな」と「カタカナ」という2つの日本語文字列をstrcmpで比較しています。一般的な日本語の辞書順(あいうえお順)では「カタカナ」の方が「ひらがな」よりも先に並びますが、このコードの実行結果では「ひらがな」の方が「カタカナ」よりもバイト値が大きいと判断されます。これは、PHPが内部で扱うUTF-8などの文字コードにおいて、「ひらがな」の文字が持つバイト値の並びが、「カタカナ」の文字のバイト値の並びよりも後になるためです。

このように、strcmpはバイト値を基準とした比較を行うため、日本語の文字列において私たちが期待するような「辞書順」での比較結果が得られない場合があります。日本語の辞書順に基づいた正確な文字列比較を行いたい場合は、mb_strcoll関数など、多言語対応の文字列比較関数を使用することを検討してください。

PHPのstrcmp関数は、文字列をバイト単位で比較します。このため、日本語の文字列(特にUTF-8などのマルチバイト文字)を比較する際には注意が必要です。一般的な日本語の辞書順(あいうえお順)と、バイト値の順序が必ずしも一致するとは限りません。例えば、「ひらがな」と「カタカナ」を比較すると、辞書順とstrcmpの比較結果で順序が逆になることがあります。日本語の辞書順で正しく文字列を比較したい場合は、strcmpではなく、ロケールに応じた比較を行うmb_strcoll()関数などの利用を検討してください。

【PHP8.x】strcmp関数の使い方 | いっしー@Webエンジニア