質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

6772閲覧

PHPで特定の値が含まれているか調べる方法

gsuisk

総合スコア72

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2017/09/18 09:16

編集2017/09/18 10:21

100までの数で3の倍数と、3のつく数字の時に"three"と出力させるプログラムを作りたいです。

3の倍数は以下のようにしました。

PHP

1for($i=1; $i<=100; $i++){ 2 if($i%3==0){ 3 echo "three"; 4 }else{ 5 echo $i; 6 } 7 echo "<br>"; 8}

しかし、3を含む時という条件をどのようにして確認すればよいのかわかりません。

正規表現で試してみたのですが、全部threeと出力されてしまいます...

for($i=1; $i<=100; $i++){ $result=preg_match("/3{0,1}/", (string)$i); if($i%3==0){ echo "three"; }else if($result){ echo "three"; }else{ echo $i; } echo "<br>"; }

初歩的な質問ですみませんが、お答えしていただけると幸いです。


追記です。

今回の場合、最大で100だとわかっているので、無理やりですが一の位、十の位、百の位の値を調べてやってみたのですが、3の倍数しかthreeになりません。

for($i=1; $i<=100; $i++){ $x = $i/100; //百の位 $y = ($i- $x*100)/10; //十の位 $z = $i-($x*100 + $y*10); //一の位 if($i%3==0){ echo "three"; }else if($x==3 || $y==3 || $z==3){ echo "three"; }else{ echo $i; } echo "<br>"; }

なぜこれがうまく機能しないのでしょうか?

mattsershaw👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A.Ichi

2017/09/19 10:56

お答えは出ているので、ご参考 $result=(strpos($i, '3') === FALSE) ? 0 : 1;
gsuisk

2017/09/19 15:33

ありがとうございます。確かに$x、$y、$zを出力してみたらintになっていませんでした。
gsuisk

2017/09/19 15:36

$i=1のとき、$x = $i/100; はなぜ0にならずに0.01となってしまうのでしょうか?C言語と挙動は違うのでしょうか?
A.Ichi

2017/09/19 22:51 編集

変数の型は、その変数が使用される文により定義される様です。$x = (int)($i/100); $y = (int)(($i- $x*100)/10);
gsuisk

2017/09/20 06:52

ありがとうございました!
guest

回答5

0

ベストアンサー

それは

php

1$result=preg_match("/3{0,1}/", (string)$i);

が常に0文字でマッチするためです


  • 特定の桁に3が含まれる 30,31,32 等も含む

php

1$result=preg_match("/3/", (string)$i);
  • 1桁目に3が含まれる 30,31,32 等も含む

php

1$result=preg_match("/^3/", (string)$i);
  • 1の桁に3が含まれる 13,23,23 等も含む

php

1$result=preg_match("/3$/", (string)$i);
  • 3の倍数である

php

1$result=($i%3)==0

追記

  • 各桁が3 である

php

1# 1の位 2$result=($i%10)==3 3# 10の位 4$result=(floor($i/10)%10)==3 5# 100の位 6$result=(floor($i/100)%10)==3

まあ 100までしかないなら

php

1for($i=1; $i<=100; $i++){ 2 // 3の倍数 3 // 1の位が3 4 // 30台 5 if ($i % 3 == 0 || $i % 10 == 3 || (30 <= $i && $i < 40)) { 6 echo "three"; 7 } else { 8 echo $i; 9 } 10 echo "<br>"; 11}

という方法もある

投稿2017/09/18 09:21

編集2017/09/19 00:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gsuisk

2017/09/18 10:31 編集

for($i=1; $i<=100; $i++){ //$result=preg_match("/3$/", (string)$i); //これはなくてもよい //$result=preg_match("/^3/", (string)$i); //これはなくてもよい $result=preg_match("/3/", (string)$i); if($i%3==0){ echo "three"; }else if($result){ echo "three"; }else{ echo $i; } echo "<br>"; } これでできました!ありがとうございます!
gsuisk

2017/09/18 10:23

無理やり正規表現を使わずにやってみたのですが、うまくいきません... もしよければ追記も見ていただきたいです。
guest

0

@r_ym さんの回答にあるように、値を確認するとわかると思いますが、この式だと int の演算とはなっていないので期待する動きになっていません。

PHP:型の相互変換

3のつく数字を判定するだけなら、 PHP:strpos をあたってみると楽できると思います。

投稿2017/09/19 04:06

編集2017/09/20 00:35
ykws

総合スコア1236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gsuisk

2017/09/19 15:20

C言語でできたのでPHPでも同じだと思っていました...ありがとうございます。
ykws

2017/09/20 00:36

言語ごとに言語仕様というのは、同じところや異なるところがあるので、一つ一つレファレンスをあたってみましょう。PHPでの型の挙動について参考となるリンクを追記しました。
gsuisk

2017/09/20 06:52

わかりました。ありがとうございます。
guest

0

なぜこれがうまく機能しないのでしょうか?

3の倍数以外のときに、$x,$y,$zをver_dumpしてみると、解決の糸口が見えるかもしれませんよ。

投稿2017/09/19 00:21

r_ym

総合スコア79

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  • 3で割ったあまりが0
  • 10で割ったあまりが3
  • 10で割った商=10で割ってintをとった数値が3

sample

PHP

1for($i=1; $i<=400; $i++){ 2 if($i%3===0 || 3 $i%10===3 || 4 call_user_func(function($x){ 5 for($j=1;$j<log10($x);$j++){ 6 if(intval($x/pow(10,$j))%pow(10,$j)===3) return true; 7 } 8 },$i) 9 ){ 10 print "<span style=\"color:red\">ok:".$i."</span><br>"; 11 }else{ 12 print "ng:".$i."<br>"; 13 } 14}

投稿2017/09/18 15:15

編集2017/09/19 03:12
yambejp

総合スコア114833

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/09/19 03:13

sampleつけときました
guest

0

既に回答が出ているため補足情報ですが、正規表現チェッカーも正規表現の確認・調整にお役立てください。

投稿2017/09/18 09:29

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gsuisk

2017/09/18 10:17

ありがとうございます。参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問