![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
Perl の世界から PHP にやってまいりました。
Perl では、文字列の比較には専用の演算子がありまして、
str1 eq str2
とすると、二つの文字列が同値かどうか調べられますが、PHP にはこのような演算子はないのでしょうか?
www.php.net のマニュアルを見ても、そのような演算子がありません。
== 演算子が使えるものかと
<?php
$str1 = "this is string" ;
$str2 = "this is string"
if( $str1 == $str2 )
{
echo "two string is same" ;
}
?>
などを試してみるとうまくいくようですが、www.php.net のマニュアルには「文字列を数値化して比較する」と書いてあり、本当に文字列比較が出来るか確信がもてず…。
結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか?
No.3ベストアンサー
- 回答日時:
結局、本題に答えていなかったので、付け足します。
> 結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか?
間違っているわけではないと思いますが、あまり一般的ではないかもしれません。
strcmp を使用して「完全一致」のテストするためには、
if(strcmp($a,$b) === 0)
もしくは
if(!strcmp($a,$b))
と記述することになります。
個人的には、少し面倒な実装に思えます。
ただ、この場合、型を意識せずに文字列をチェックできるので
$a = 1;
$a = '1';
でも、if が真を返す利点はあります。
同じ状況で、以下のような比較演算子でチェックすると、if は偽を返します。
if($a === $b)
両辺の変数の型が合わないためです。
確実に「文字列型」だと判っていれば、これでも良いのですけどね。
これを元に、真を返すように改変を加えるとすれば、
if(strval($a) === strval($b))
のように、変数の型を文字列型に統一しなければなりません。
ここまで厳密なチェックを求めるのなら、strcmp を使った方が良いかもしれません。
BLUEPIXY さんへのお礼にも書きましたが、数値/文字列がどのタイミングで型変換されるか/されないのかが少しわかりづらいように感じます(私だけかもしれませんが)。
私のような未熟者は確実に strcmp したほうがよさげですね…。
No.2
- 回答日時:
#1 の方に補足というか蛇足ですが。
> if("1.0"=="1"){ ... は、yes になります。
if("1.0" === "1"){ ... で型の評価も行うため、yes を返さないようになります。
No.1
- 回答日時:
格別PHPに詳しいというわけではないですが、
PHPで eq に相当する、文字列の等値判定のみに使われる演算子というのはなかったと思います。
その意味では、== が文字列同士の等値の判定に使われます。
ただ、説明にもあるように数値と文字列を対象に使った場合は、数値として比較します。
if(0=="b"){
print "yes";
}
#yes と表示される
if("0"=="b"){
print "yes";
}
#何も表示されない
いつも数値化して比較するのであれば
if("a"=="b"){
print "yes";
}
がyes になるはずですが、そうはなりません。
ただ、
if("1.0"=="1"){
print "yes";
}
は、yes になります。
そういう動作が不安な時には、scrcmp を使うのがいいのかもしれません。
>マニュアルには「文字列を数値化して比較する」と書いてあり
http://www.php.net/manual/ja/language.operators. …
のことだと思いますが、
「多くの型では、以下の表に(上から順に)したがって比較が行われます。」
とありますので、文字列同士の場合、まず、文字列同士として比較されるので、数値化して比較するは、もう片方が数値の場合だと思われます。
>文字列同士の場合、まず、文字列同士として比較されるので、数値化して比較するは、もう片方が数値の場合だと思われます。
>if("1.0"=="1"){
>print "yes";
>}
>は、yes になります。
ちょっと混乱してます。クォーテーションでくくった「数値」は文字列なのではないのでしょうか…。やっぱり strcmp を使ったほうが安全そうですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- PHP 空文字 "" ですが 空文字の意味を教えてください。 3 2022/08/05 03:51
- Excel(エクセル) エクセルで2つの表を比較して、文字列が同じだが、その行のある値が違うものを抽出したい 1 2022/10/06 21:48
- C言語・C++・C# いまc言語の標準ライブラリ文字列を勉強しているのですがいまいちわかりません。 strcmpとmemc 5 2023/07/04 15:34
- Excel(エクセル) エクセルの日付から年末尾2桁と月を1月をA~Lに変換したい 3 2022/08/08 10:32
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- その他(プログラミング・Web制作) Tを主張Sの前後に文字列を追加したものとし、Tを教えて!gooで削除されないようにできる? 2 2023/02/10 15:35
- Visual Basic(VBA) 違う文字のみ色を塗る方法がわかりません。。 G列とH列のに文字が入っています。 例えばG5とH5の文 3 2022/06/03 17:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を大文字の2桁ごとのコン...
-
is_callable()の第二引数の使い方
-
onedrive にexcelファイルをア...
-
別ファイルの変数を呼び出した...
-
PHPのif文でその処理を途中で抜...
-
フォントの色を変えるには?
-
.phpと.incファイルの違いはな...
-
「@$変数」の「@の意味は?」
-
【file_exists】ファイルが存在...
-
$_SESSION 有効期限をブラウザ...
-
stat failed
-
2つの画像ファイルが異なるファ...
-
PHPで新しいウインドウで開く命...
-
CFileDialogの最初のディレクト...
-
【PHP】画像が表示されず「×」...
-
Subversionのリポジトリの削除
-
別PHPファイルに変数を渡す
-
「クラス関数」「メンバ関数」...
-
mailやmb_send_mail関数で、本...
-
TCPDFについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
php文字列中のシングルクオート...
-
if ('0.0'=='0'){ の0.0とは何
-
文字列の抜き取りなのですが思...
-
文字列を%+2桁のヘキサ
-
PHPのGETとPOSTの処理を学習中...
-
GETの値について
-
【比較演算子】偶数・奇数識別...
-
ランダム(不規則)な文字列の...
-
phpで、数字+文字列(ex.13才、5...
-
終端識別子 とは?
-
パラメーター付きのURLをリダイ...
-
特定の漢字に\\マークが入って...
-
愚かにもワンクリック詐欺のサ...
-
秀丸エディタのハイライト(mar...
-
php→JavaScript間の変数受け渡し
-
文字列に含まれている「,」をカ...
-
文字列を大文字の2桁ごとのコン...
-
仕様ならしようがない(洒落)
-
PHPでPが2個あるので分かりず...
-
PHPにおいて16進数のアスキー文...
おすすめ情報