[PHP-users 7425] Re: 長い文字列の比較

Shindo@AtSystem php-users@php.gr.jp
Tue, 14 May 2002 11:02:49 +0900


(有)アットシステムの進藤です。
お世話になっております。

森川さんの推測が正しいと思います。
念のために以下のような実験をして見ました

=*=*=*=*=*=*=*=*=*=*=*=*=
<html><body>
<?

$str1 = "12345678901234567891";
$str2 = "12345678901234567892";
$f1 = (float)$str1;
$f2 = (float)$str2;
$bs1 = ($str1 == $str2);
$bf = ($f1 == $f2);

echo "str1=$str1, str2=$str2, bs1=".($bs1?"TRUE":"FALSE")."<br>";
echo "f1=$f1, f2=$f2, bf=".($bf?"TRUE":"FALSE")."<br><br>";

$bs2 = (string)$str1 == (string)$str1;
$bs3 = (string)"12345678901234567891" == (string)"12345678901234567892";
$bs4 = "a".$str1 == "a".$$str2;
$bs5 = $str1 === $$str2;

echo "bs2=".($bs2?"TRUE":"FALSE")."<br>";
echo "bs3=".($bs3?"TRUE":"FALSE")."<br>";
echo "bs4=".($bs4?"TRUE":"FALSE")."<br>";
echo "bs5=".($bs5?"TRUE":"FALSE")."<br>";

?>
</body></html>
=*=*=*=*=*=*=*=*=*=*=*=*=

で、
> # まぁ binary safe なんで、普通 strcmp() を使いますね。
が良いのでしょうが
if( "a".$str1 == "a".$str2 )
なんてコーディングもありそうですね。
PHP4ならば
if( $str1 === $str2 )
で良い気がします。


--- snip --- Cyoki Cyoki ---
>これでテストしていました。
>
>$str1 = "12345678901234563";
>$str2 = "12345678901234564";
>
>今日気付いたのですが、これだと違う結果になります。
>
>$str3 = "1234567890123456a";
>$str4 = "1234567890123456b";
>
>($str1==$str2) は TRUEになります。
>($str3==$str4) は FALSEになります。
>
>gettypeで確認すると、$str1も$str2も'string'だったので、文字列と
>して比較してくれてると思い込んでいたのですが、($str1==$str2)は
>どうやら両辺を数値として評価して比較演算しているような気がします。
>
>多分つぎのようなことがおきているのではないかと推測しています。
>$str1,$str2はそれぞれinteger型として評価され、オーバーフローにより
>最終的にfloat型の数値として比較。この時、$str1,$str2ともにfloatで
>扱える最大値(マニュアルによればプラットフォーム依存、通常はおよそ
>10進数で14桁の精度とのこと)を越えたため両者とも同じ値(最大値)と
>なり、($str1==$str2)はTRUEとなる。
>
># PHP4.2.xではfloatval()というのがあるのですね。
># floatval($str1)とfloatval($str2)が同じ値になることを確認できれ
># ば良いのですが、手元に環境がないので確認はできていません。
>

」」」」」」」」」」」」」」」」
」
」  進藤寿則@アットシステム
」  shindo@atsystem.jpshindo@sasoh.ne.jp