私は2つの文字列を比較し
strcmp(1,2)
ていますが、1の代わりに「-1」が表示されます。私のコードは以下のとおりです。
<?php
echo strcmp(1,2);
?>
出力:-1
falseで-1になる理由とその処理方法を教えてください。
1は2未満であり、strcmpは次を返すものとして定義されます。
str1がstr2より小さい場合、<0を返します。str1がstr2より大きい場合は>0、等しい場合は0。
したがって、動作は予想されます。
次の注意事項に注意してください。
安全な文字列比較のためにstrcmpに依存している場合、両方のパラメーターは文字列でなければなりません。そうでない場合、結果は非常に予測できません。たとえば、予期しない0を取得したり、NULL、-2、2、3、および-3の値を返したりする場合があります。
のドキュメントページのコメントからstrcmp
。
PHPは、この種の予期しない動作でいっぱいです。あなたの状況では、混乱を避けるために、両方の引数が文字列としてキャストされていることを確認します。
$first = 1;
$second = 2;
echo strcmp((string)$first, (string)$second);
intを渡すと、次のように文字列にキャストされます。
var_dump(strcmp('1', 2)); //-1
-1である理由は、strcmpの最も広く使用されている実装が最初の等しくない文字を見つけて、その差を返すためです。
言い換えれば、それは本質的に「1」-「2」であり、49〜50です(「1」および「2」のASCIIコード)。
49-50は-1です。
編集:厳密には関連していませんが、好奇心から、いくつかの掘り下げを行いました。これは将来の動作を保証するものではありませんが、PHP5.4からです。
ZEND_FUNCTION(strcmp)
{
char *s1, *s2;
int s1_len, s2_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &s1, &s1_len, &s2, &s2_len) == FAILURE) {
return;
}
RETURN_LONG(zend_binary_strcmp(s1, s1_len, s2, s2_len));
}
ZEND_API int zend_binary_strcmp(const char *s1, uint len1, const char *s2, uint len2) /* {{{ */
{
int retval;
if (s1 == s2) {
return 0;
}
retval = memcmp(s1, s2, MIN(len1, len2));
if (!retval) {
return (len1 - len2);
} else {
return retval;
}
}
それは確かに文字列にキャストします。