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

Shindo@AtSystem php-users@php.gr.jp
Tue, 14 May 2002 13:02:50 +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>
>=*=*=*=*=*=*=*=*=*=*=*=*=

付け忘れた実行結果です。
=*=*=*=*=*=*=*=*=*=*=*=*=
str1=12345678901234567891, str2=12345678901234567892, bs1=TRUE
f1=1.2345678901235E+19, f2=1.2345678901235E+19, bf=TRUE

str1=12345678901234567891, str2=12345678901234567892
bs2=TRUE
bs3=TRUE
bs4=FALSE
bs5=FALSE
=*=*=*=*=*=*=*=*=*=*=*=*=

>
>で、
>> # まぁ 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