【PHP8.x】strncmp関数の使い方
strncmp関数は、2つの文字列を指定された文字数分だけ比較する関数です。この関数は、最初の文字列と2番目の文字列を引数として受け取り、さらに何文字目までを比較対象とするかを整数で指定します。比較処理はバイト単位で行われ、大文字と小文字を区別して厳密に評価されます。
戻り値は整数値です。もし最初の文字列が2番目の文字列よりも辞書順で小さい(または早い)場合、負の値を返します。両方の文字列が指定された文字数まで完全に一致する場合は、0を返します。そして、最初の文字列が2番目の文字列よりも辞書順で大きい(または遅い)場合は、正の値を返します。
この関数は、文字列の先頭部分のみが一致するかどうかを確認したい場合や、ファイル名のプレフィックスを比較する際などに特に役立ちます。文字列全体を比較するstrcmp関数とは異なり、部分的な一致を確認したい状況で効率的に利用できます。システムエンジニアとして、特定の条件で文字列の等価性を判断する場面で非常に重要な役割を果たします。
基本的な使い方
構文(syntax)
int strncmp(string $string1, string $string2, int $length)
引数(parameters)
string $string1, string $string2, int $length
- string $string1: 比較対象となる1つ目の文字列
- string $string2: 比較対象となる2つ目の文字列
- int $length: 比較する文字列の最大バイト数
戻り値(return)
int
strncmp関数は、2つの文字列の先頭から指定された文字数だけを比較し、その結果を整数で返します。返り値は、文字列1が文字列2より小さい場合は負の値、等しい場合は0、大きい場合は正の値となります。
サンプルコード
strncmp() 関数で文字列の先頭部分を比較する
<?php
/**
* このスクリプトは、strncmp() 関数の基本的な使い方を示します。
* strncmp() は、2つの文字列の最初の指定されたバイト数だけをケースセンシティブに比較します。
*
* 戻り値:
* - 0: 2つの文字列の指定された部分が等しい場合
* - < 0: string1 の指定された部分が string2 よりも小さい場合
* - > 0: string1 の指定された部分が string2 よりも大きい場合
*/
/**
* strncmp() 関数の使用例を表示する関数
*/
function demonstrateStrncmp(): void
{
echo "--- strncmp() 関数のデモンストレーション ---" . PHP_EOL;
$string1 = "Hello World!";
$string2 = "Hello PHP!";
$string3 = "Hello Developers!";
$string4 = "Hi there!";
// 例 1: 最初の5文字が等しい場合
// "Hello" と "Hello" を比較
$length1 = 5;
$result1 = strncmp($string1, $string2, $length1);
echo "比較: '" . substr($string1, 0, $length1) . "' と '" . substr($string2, 0, $length1) . "'" . PHP_EOL;
echo "strncmp('{$string1}', '{$string2}', {$length1}) の結果: {$result1}" . PHP_EOL;
if ($result1 === 0) {
echo " -> 結果: 最初の {$length1} 文字は等しいです。" . PHP_EOL . PHP_EOL;
}
// 例 2: string1 の指定部分が string2 よりも小さい場合 (辞書順)
// "HellW" と "HellP" を比較 (WはPより大きいが、strncmpは文字コード順に比較するため、"World"の"W"と"PHP"の"P"を比較しない。例を修正)
// 最初の6文字を比較: "Hello " vs "Hello P"
$length2 = 7; // "Hello W" と "Hello P"
$result2 = strncmp($string1, $string2, $length2); // "Hello W" (from World) vs "Hello P" (from PHP)
echo "比較: '" . substr($string1, 0, $length2) . "' と '" . substr($string2, 0, $length2) . "'" . PHP_EOL;
echo "strncmp('{$string1}', '{$string2}', {$length2}) の結果: {$result2}" . PHP_EOL;
if ($result2 > 0) {
echo " -> 結果: 最初の {$length2} 文字において、string1 は string2 よりも大きいです。" . PHP_EOL . PHP_EOL;
}
// 例 3: string1 の指定部分が string2 よりも大きい場合 (辞書順)
// "Hello W" と "Hello D"
$length3 = 7;
$result3 = strncmp($string1, $string3, $length3); // "Hello W" (from World) vs "Hello D" (from Developers)
echo "比較: '" . substr($string1, 0, $length3) . "' と '" . substr($string3, 0, $length3) . "'" . PHP_EOL;
echo "strncmp('{$string1}', '{$string3}', {$length3}) の結果: {$result3}" . PHP_EOL;
if ($result3 > 0) {
echo " -> 結果: 最初の {$length3} 文字において、string1 は string2 よりも大きいです。" . PHP_EOL . PHP_EOL;
}
// 例 4: 指定された長さが文字列の長さよりも長い場合、文字列全体が比較される
// "Hello World!" と "Hi there!" の最初の2文字を比較
$length4 = 2;
$result4 = strncmp($string1, $string4, $length4); // "He" vs "Hi"
echo "比較: '" . substr($string1, 0, $length4) . "' と '" . substr($string4, 0, $length4) . "'" . PHP_EOL;
echo "strncmp('{$string1}', '{$string4}', {$length4}) の結果: {$result4}" . PHP_EOL;
if ($result4 < 0) {
echo " -> 結果: 最初の {$length4} 文字において、string1 は string2 よりも小さいです。" . PHP_EOL . PHP_EOL;
}
}
// 関数の実行
demonstrateStrncmp();
?>
PHPのstrncmp
関数は、二つの文字列の最初の指定されたバイト数だけをケースセンシティブ(大文字と小文字を区別)に比較する関数です。この関数は、比較したい二つの文字列と、比較するバイト数を引数として受け取ります。戻り値は整数値で、比較結果を示します。もし二つの文字列の指定された部分が完全に一致すれば0が返され、最初の文字列の指定された部分が二番目の文字列よりも辞書順で小さい場合は負の数、大きい場合は正の数が返されます。例えば、「Hello World!」と「Hello PHP!」を最初の5バイトで比較すると、どちらも「Hello」であるため0が返されます。しかし、最初の7バイトで比較すると、「Hello W」と「Hello P」を比較することになり、'W'が'P'よりも辞書順で大きいため、正の数が返されます。指定されたバイト数が文字列の実際の長さよりも長い場合でも、関数は文字列の終わりまでを比較します。この関数は、文字列の一部を基にした厳密な比較を行いたい場合に特に有用です。
strncmp
関数は、文字列を指定バイト数だけ大文字・小文字を区別して比較します。マルチバイト文字ではバイト数と文字数が異なるため、予期せぬ比較結果を招く可能性がありますので注意が必要です。戻り値は、一致すれば0、string1
が小さければ負、大きければ正の整数です。結果判定には=== 0
や> 0
などの比較演算子を適切に使いましょう。比較する長さが文字列の実際の長さより長くてもエラーにはならず、文字列全体が比較されます。