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

Yasuo Ohgaki php-users@php.gr.jp
Tue, 14 May 2002 10:38:10 +0900


大垣です。

Type Jagglingのマニュアルページに大まかに記述されています。

Eita Morikawa wrote:
> 森川です。
> 
> On Mon, 13 May 2002 23:51:54 +0900
> HAYAKAWA Hitoshi <cz@hykw.tv> wrote:
> 
> 
>>早川仁です。
>>
>>At Mon, 13 May 2002 23:19:29 +0900,
>>Eita Morikawa wrote:
>>
>>
>>>文字列の比較に'=='を用いた場合、最初の16文字のみしか対象に
>>>してくれないようです(PHP4.1.2と4.0.5で確認しました)。
>>>
>>>'==='を用いるかstrcmp()で比較を行うと、140文字程度の文字列
>>>しか試していませんが、期待通りの結果が得られました。
>>>
>>>スクリプトを書き直そうと思っているのですが、長い文字列を
>>>比較する場合のお勧めの方法をご教授いただけないでしょうか?
>>>とりあえずやりたいのは、一致するか否かだけの判断です。
>>
>>その == で比較した時の左辺値と右辺値はどうなっていますか?
> 
> 
> これでテストしていました。
> 
> $str1 = "12345678901234563";
> $str2 = "12345678901234564";
> 
> 今日気付いたのですが、これだと違う結果になります。
> 
> $str3 = "1234567890123456a";
> $str4 = "1234567890123456b";
> 
> ($str1==$str2) は TRUEになります。
> ($str3==$str4) は FALSEになります。
> 
> gettypeで確認すると、$str1も$str2も'string'だったので、文字列と
> して比較してくれてると思い込んでいたのですが、($str1==$str2)は
> どうやら両辺を数値として評価して比較演算しているような気がします。

PHPでは数値になりそうな文字列は自動的に数値に変換後
比較します。

> 
> 多分つぎのようなことがおきているのではないかと推測しています。
> $str1,$str2はそれぞれinteger型として評価され、オーバーフローにより
> 最終的にfloat型の数値として比較。この時、$str1,$str2ともにfloatで
> 扱える最大値(マニュアルによればプラットフォーム依存、通常はおよそ
> 10進数で14桁の精度とのこと)を越えたため両者とも同じ値(最大値)と
> なり、($str1==$str2)はTRUEとなる。

確かめていませんが、precisionである程度精度を制御できたと思います。

> 
> # PHP4.2.xではfloatval()というのがあるのですね。
> # floatval($str1)とfloatval($str2)が同じ値になることを確認できれ
> # ば良いのですが、手元に環境がないので確認はできていません。


キャストすれば同じです。

$fv = (double)$str1;


> 
> マニュアルで関連する項目を下に抜粋しますが、上の仮説が正しいとして、
> PHPはどういう場合に文字列を数値として評価するのでしょう?
> 私はarray_search()で、$str1のような文字列を扱ってはまりました。。。

評価されるコンテクストで数字で始まる文字列は数値とし
て扱えるものとして取り扱われます。

<?php
$str = "123 this is a test";
$v = $str + 100;
echo $v;
?>
結果
223

ただし、文字列に対する++, --は意味が違うので
$str++;
としても
124
ではなく
123 this is tesu
になります。

--
Yasuo Ohgaki

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/