PHPでの文字列と数値の比較について

このQ&Aのポイント
  • PHPの仕様により、数字の0を文字列として扱う際には注意が必要です。
  • 数値として比較する場合、0はFALSEとなりますが、文字列として比較する場合は"0"でもTRUEとなります。
  • このような挙動は、PHPの内部的な仕組みによるものであり、注意が必要です。
回答を見る
  • ベストアンサー

0をstringにできません。

PHPで数字の0をstringとして扱えないようですが これは仕様でしょうか? ---------------------- echo("<br>数値として比較:"); $in=0; echo('<br>0の場合値は'); if($in==FALSE){echo('FALSE');} $in=1; echo('<br>1の場合値は'); if($in==TRUE){echo('TRUE');} echo("<br><br>文字列として比較:"); $in='0'; settype($in,"string"); echo('<br>"0"の場合値は'); if($in==FALSE){echo('FALSE');} $in='1'; settype($in,"string"); echo('<br>"1"の場合値は'); if($in==TRUE){echo('TRUE');} ---------------------- 上記コードを実行してみると ---------------------- 数値として比較: 0の場合値はFALSE 1の場合値はTRUE 文字列として比較: "0"の場合値はFALSE "1"の場合値はTRUE ---------------------- となって0がstringとして扱われてるのなら 文字列として比較した場合0でも1でもTRUEに なると思うのですが・・・

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

"0"の場合にstringとして扱われないわけではなく、 if($in==FALSE) のときに、$inが暗黙の型変換でbooleanに変換され、FALSEと扱われているのでしょう。 booleanに変換したときのFALSEと見なされる値については、以下のURLを参照してください。 http://phpspot.net/php/man/php/language.types.boolean.html

gorogoro_01
質問者

お礼

早速のご回答有り難うございます。 なるほど、そういう仕様になっていたのですね。 「 booleanに変換する場合、次の値はFALSEとみなされます。 空の文字列、 および文字列の "0"」 とかいてありました。 ちなみに"0"でなく"00"のように使えば期待した結果になりました。 ------------------------------------------ echo("<br>数値として比較:"); $in=00; echo('<br>00の場合値は'); if($in==FALSE){echo('FALSE');}else{echo('TRUE');} $in=1; echo('<br>1の場合値は'); if($in==TRUE){echo('TRUE');}else{echo('FALSE');} echo("<br><br>文字列として比較:"); $in='00'; settype($in,"string"); echo('<br>"00"の場合値は'); if($in==FALSE){echo('FALSE');}else{echo('TRUE');} $in='1'; settype($in,"string"); echo('<br>"1"の場合値は'); if($in==TRUE){echo('TRUE');}else{echo('FALSE');} ------------------------------------------ 出力結果 ------------------------------------------ 数値として比較: 00の場合値はFALSE 1の場合値はTRUE 文字列として比較: "00"の場合値はTRUE "1"の場合値はTRUE ------------------------------------------

関連するQ&A

  • strlen関数について

    文字列の長さがとれなくて困っています。 プログラムは、以下の通りです。 実行すると、1の箇所で66になります。 次に値の文字数(2の箇所)を出そうとすると、6と出てしまいます。 見ていると、$sumkey1を変数ではなく文字列として見入るみたいなのですが、 直前に、直接数字を代入するとちゃんとした値がとれます。 どうしたらよいか、わかる方いらしたら教えてください。 <?php $a= abcde12345678912345678912345678912; for($h=1; $h<5; $h++){ for($i=0; $i<8; $i++){ if($h == 1){ $sumkey1= $sumkey1 + hexdec(substr($a ,$i,1)) . "<br>"; }else if($h == 2){ $sumkey2= $sumkey2 + hexdec(substr($a ,$i+8,1)) . "<br>"; }else if($h == 3){ $sumkey3= $sumkey3 + hexdec(substr($a ,$i+16,1)) . "<br>"; }else if($h == 4){ $sumkey4= $sumkey4 + hexdec(substr($a ,$i+24,1)) . "<br>"; } } } //最初の8つを16から10進数にして足した値 echo $sumkey1 . "<br>"; //1 //文字列の長さ echo strlen($sumkey1). "<br>"; //2 //文字列? echo var_export(is_numeric($sumkey1), true); //3 ?>

    • ベストアンサー
    • PHP
  • C#で char型とstring型の比較で Equalsでハマりました。 

    C#で char型は値型でstring型は参照型ですがこの比較を正しく行うにはどうしたらよいでしょうか? string s = "0123456789"; Console.WriteLine(s[0]); Console.WriteLine("0".Equals(s[0]) ? "true" : "false"); で、falseなのは驚きでした。 Equalsを鵜呑みにしていました。 コンパイルできたので今まで気づきませんでした。 詳しい方、教えて頂けますか?

  • 全角数値の判定

    教えて頂けますか? フォームからPOSTされた文字列が半角数値、または文字列の場合許可し、全角数値の場合拒否したいのですが 全角数値が is_numeric で数値として認識しない為 うまくいきません。 他に良い方法がありますか? よろしくおねがいします。 if ( strlen($_POST['test']) != mb_strlen($_POST['test'],'UTF-8') && is_numeric($_POST['test']) == TRUE ){ echo '半角で入力してください。<br />'; }

    • ベストアンサー
    • PHP
  • syntax errorの原因について

    Parse error: syntax error, unexpected ';' in C:\xampp\htdocs\meibo_kanri.php on line 101 と出てしまいますが、どこがダメなのかさっぱり分からず困っています。 コードは、次のようになります。 phpを知ってまだ一週間で、なかなか理解することができず、無知なひよっこです。 どうか、ご助力ください。 【コード】 <?php //セッション開始 session_start(); //データベース設定 $dbServer='localhost'; $dbUser='root'; $dbPass='1234'; $dbName='kadaitest_db'; $flag=TRUE; //フラグ変数の初期化 //データベース接続 if(!$link = mysql_connect($dbServer,$dbUser,$dbPass)){ $flag=FALSE; } else if(!mysql_set_charset('utf8',$link)){ //クライアント側の文字コードと、サーバ側の文字コードの設定 $flag=FALSE; } if($flag==TRUE){ //データベース選択 $db_selected = mysql_select_db($dbName, $link); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } /* //登録した内容の一覧表示 $result = mysql_query('SELECT id,name,date,address,tel,age FROM list'); if (!$result) { die('クエリーが失敗しました。'.mysql_error()); } while ($row = mysql_fetch_assoc($result)) { print('会員No:'.$row['no']); print(' 名前:'.$row['name']); print(' カナ:'.$row['kana']); print(' 生年月日:'.$row['birth']); print(' 入会日:'.$row['enter'].'<br/>'); } */ } else{ echo 'データベースエラー'; } ///////////////////////////////////////////////////// //////////////////////////// //入力した値の変数を設定 $in_no=$_POST['no']; $in_name=$_POST['name']; $in_kana=$_POST['kana']; $in_birth=$_POST['birth']; $in_enter=$_POST['enter']; /*新規登録 */ if($_POST['toroku']) { echo '<div class="kekka"><strong>【新規登録】</strong><br />'; //「会員No」を入力した場合 if($in_no){ //「会員No」に半角数字を入力した場合 if(ctype_digit($in_no)){ //「会員No」に5桁入力した場合 if(strlen($in_no)==5){ //クエリの作成 $sql = sprintf("INSERT INTO list (id,name,kana,birth,enter) VALUES ('%s','%s','%s','%s','%s')",mysql_real_escape_string($in_no),mysql_real_escape_string($in_name), mysql_real_escape_string($in_kana),mysql_real_escape_string($in_birth), mysql_real_escape_string($in_enter)); //クエリの実行 $result_flag = mysql_query($sql); if ($result_flag) { echo '以下の内容で登録しました。<br />'; } else { echo '<span class="err">登録が失敗しました。<br />'.mysql_error().'</span>'; } //「会員No」に5桁以外を入力した場合 } else { echo '<span class="err">登録が失敗しました。<br />「会員No」は5桁で入力してください。</span>'; } //「会員No」に半角数字以外を入力した場合 }else{ echo '<span class="err">登録が失敗しました。<br />「会員No」は半角数字で入力してください。</span>'; } //「会員No」を入力していない場合 }else{ echo '<span class="err">登録が失敗しました。<br />登録する会員Noが指定されていません。</span>'; } //入力内容の表示 echo '<br />■入力内容<br />'; echo '<span>会員No</span>:'.$in_no.'<br />'; echo '<span>名前</span>:'.$in_name.'<br />'; echo '<span>カナ</span>:'.$in_kana.'<br />'; echo '<span>生年月日</span>:'.$in_birth.'<br />'; echo '<span>入会日</span>:'.$in_enter.; echo '</div>'; //セッション終了 session_destroy(); } // 結果セットに関連付けられているリソースの開放 // これは、スクリプトが終了する際に自動的に実行されます。 //mysql_free_result($result); //メモリ開放(mysql_queryより得られた値) // DBリンクの切断 // これは、スクリプトが終了する際に自動的に実行されます。 $close_flag = mysql_close($link); ?>

    • ベストアンサー
    • PHP
  • 文字列比較の演算子

    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 的には正しいのでしょうか?

    • ベストアンサー
    • PHP
  • C#で配列の戻り値について

    プログラミング初心者で、ただいまC#の勉強中です。 bool型(trueまたはfalse)とstring型(関数内で取得した文字列)の値を 配列で関数の戻り値として返したいのですが、どうすれば良いのかわかりません。 true/falseもstringとして呼び出し側で判別するしか方法はないのでしょうか。 アドバイスをお願いいたします。

  • JAVAのプログラムについて・・・

    次のプログラムで分からないところがあります。 教えてください。 プログラムの説明 ・キーボードからの任意の個数の数値を入力し、入力した数値の個数と最大値を画面に表示する。 ・負の値を入力したらプログラムを終了する。いきなり負の値を入力することはないものとする。 入出力例 ()内の数値は、入力データである。この例の場合、入力は8個であるが、最後のデータは処理の終了を指示するものであるから、データの個数には含まない。 input1:(18) input2:(10) input3:(7) input4:(16) input5:(9) input6:(20) input7:(13) input8:-1 number=7 max=20 プログラムを一応考えてみました。 import java.io.*; class RepEx2{ public static void main(String[]args) throws IOException{ int in , n , max = 0; BufferedReader br = new BufferedReader(new InputsteeamReader(System.in)); //入力の準備       for(n = 1;true; n++){ //永久ループ          System.out.print("input"+n+":"); String s = br.readLine(); //キーボードからの文字列を入力          in =(1) (s); //文字列を数値に変換          if(in < 0) (2); //入力数値が負の時はルループ脱出          if((3)>(4))(5); //最大値の更新    } n--; (6)       System.out.printin("nember = " + n + " max = " + max); } } これでいいのでしょうか? (1)~5までは何を入れたらいいですか? また、(6)のn--;の命令はなぜ必要になるのでしょうか?

  • javascript関数の戻り値でphpの条件分岐

    こんばんは。 またまたプログラミングで詰まってしまいました・・・。 <?php    echo "<script> funcJS(); </script>"; //javascriptの関数。戻り値true/false    if(funcJS()の戻り値がtrueかどうか){       <~phpの処理~>     } ?> のようなプログラムがあったとして、funcJS()の戻り値の値によって、『phpの処理』を行うかどうかを決定したいのですがそのアルゴリズムが思いつきません。 色々と試行錯誤はやってみて、 (1)phpの変数にfuncJS()の戻り値を格納して、if文で条件分岐  $value = "<script> funcJS(); </script>";   しかし、これは$valueに戻り値を入れることができませんでした。 (2)javascript変数に戻り値を格納して、javascript内のif文で条件分岐 <?php    echo "<script> var value=funcJS(); </script>"; //javascriptの関数。戻り値true/false    echo "<script> if(value == 'true'){ </script>";       <~phpの処理~>    echo "<script> } </script>"; ?>  これも"}"がないと怒られてしまいました。 自分で思いつく限りは試してみたのですが、他に方法が思い浮かばず頭を抱えている状態です。 何か良い方法を知っている方、思いついた方、よろしくお願いします。

  • String型の値が大文字か小文字か判定する

    いつもお世話になっています。 String型の値が、大文字か小文字か判定することはできないのでしょうか? char型だと Charactereクラスを使用し判定が可能なのですが。 ◆char型の場合◆ List list = new ArrayList(); //比較する文字列 String mozi = "Abc"; //ループ for(int m=0;m<mozi.length();m++) { //文字を順に小文字かどうか調べる char ccc = mozi.charAt(m); //小文字の場合に限りlistに格納 if(Character.isLowerCase(ccc) == true) { list.add(ccc); } } //表示 for(int l=0;l<list.size();l++) { System.out.println("list="+list.get(l)); } したいのが、 ◆String型◆ List list = new ArrayList(); List list2 = new ArrayList(); list.add("TEST"); list.add("sam"); list.add("OSIETE"); for(int l=0;l<list.size();l++ ) { String compareMozi =(String) list.get(l); //ここで文字列compareMoziが大文字か小文字か調べて、小文字のときだけlist2に格納する } な感じです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • 【Java】複数の引数の数値と文字列の判定

    Javaについてです。 コマンドライン引数を複数渡し、渡ってきた値が数字のみの場合は、数値*数値の文字数を出力し 数字のみでない場合は文字列を逆から1文字ずつ出力する。 数値の判定はtry/catchで行い、catchメソッドには「stringFlg = true;」のみにする。 というプログラムを作りたいのですが、 引数が1つの時は上手くいくのですが、11 2あ あ3 44を渡した場合、 22 あ 2 3 あ 88 と出るはずが、 22 1 1 あ 2 3 あ 4 4 と出てしまいます…。 どうしたら全ての引数を正しく表示出来るのでしょうか?教えて下さい。 現時点のソースコードです。 public class Test { public static void main(String[] args) { boolean stringFlg = false; try { if(StringUtils.isNumeric(args[0])){ for(String arg : args) { int num = Integer.parseInt(arg); System.out.println(num * arg.length()); } } else{ stringFlg = true; } } catch (NumberFormatException e) { stringFlg = true; } if(stringFlg){ for(String val : args) { String[] str = val.split(""); for(int i = str.length-1; i >= 0; i--){ System.out.println(str[i]); } } } } }

    • ベストアンサー
    • Java