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

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

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

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

Q&A

解決済

4回答

148閲覧

PHP  似た式 簡潔に書く方法

akoro

総合スコア27

PHP

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

0グッド

0クリップ

投稿2018/12/26 03:18

■背景
プログラミング言語(PHP)を独学し始めて四週間に入りました。
サイコロの出目の回数を数えています。
質問の仕方に不備がございましたら、申し訳ございません。

■実現したいこと
このように(以下)似たような式が続いているので、簡潔に書きたい(もし方法があれば)

<?php $count1=0; $count2=0; $count3=0; $count4=0; $count5=0; $count6=0; for($i=1;$i<=1000;$i++){ $num=mt_rand(1,6); $count1+=substr_count($num,"1"); $count2+=substr_count($num,"2"); $count3+=substr_count($num,"3"); $count4+=substr_count($num,"4"); $count5+=substr_count($num,"5"); $count6+=substr_count($num,"6"); } echo $count1."<br>\n"; echo $count2."<br>\n"; echo $count3."<br>\n"; echo $count4."<br>\n"; echo $count5."<br>\n"; echo $count6."<br>\n"; ?>

■試したこと、結果
・sprintf使用(for文内の式)

$num[]=array(1,2,3,4,5); $format='$count."%d"+=substr_count($num,"%d")'; sprintf($format,$num[0]); ・・・ sprintf($format,$num[6]);

ここでは省略しましたが、$num[0]~$num[6]すべて入力した
エラーがでてしまい作動せず

・関数化(for文内の式)

function countnum($countnum★){ $countnum★+=substr_count($num,"☆"); }

★と☆の部分に同じ数字を入れたいのですが、関数ごとの代入しかできず、最後の☆は変数でなく数字のみなので、この先進めず

・変数設定

$count1,$count2,$count3・・・$count6=0;

真ん中省略しましたが、$count1から$count6まですべて打ち込み、カンマで繋いだ
エラー表示で作動せず

■環境
windows xampp3.2.2 Atom

一行の式ならわざわざ簡略化せずとも良いかもしれませんが、
より数字が大きくなったときに対処できるよう調べております。

何か良い解決策ありましたらご教授ください。
特に方法がない場合もその旨一言いただけますと幸いです。

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

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

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

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

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

yoorwm

2018/12/26 03:26

とりあえず配列使いましょう。というか、いちいち質問していないでマニュアル読んだら?
guest

回答4

0

php

1<?php 2$count = []; 3for($i=1;$i<=1000;$i++){ 4 $count[]=mt_rand(1,6); 5} 6$num = array_count_values($count); 7 8for($j = 1; $j <= 6; $j++) { 9 echo "{$j}は".($num[$j] ?? 0)."コ\n"; 10}

前回これに応えられる回答してたんで。

--補足

php

1function countnum($countnum){ 2 $countnum+=substr_count($num,"☆"); 3}

こういうのが動作するには

php

1function countnum($index, $num) { 2 global $countnum1; 3 global $countnum2; 4 global $countnum3; 5 global $countnum4; 6 global $countnum5; 7 global $countnum6; 8 $str = "countnum{$index}"; 9 $$str += substr_count($num."", $index.""); 10}

みたいな(みたいっていうのは検証してないってこと)ことをしないといけなくて、まあglobal参照とかとってもよくないことしてるのでやめたほうがいいです。簡潔にしたこと以上のデメリットがあるので。

投稿2018/12/26 03:27

編集2018/12/26 03:31
papinianus

総合スコア12705

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

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

akoro

2018/12/26 04:03

結果行数増えたり、変わらないのであればあえてややこしくする必要ないですね。丁寧にありがとうございます。
guest

0

PHP

1while (@$i++ < 1000) { 2 @$count[mt_rand(1, 6)]++; 3} 4print_r($count);

投稿2018/12/26 04:04

編集2018/12/26 04:14
kunai

総合スコア5405

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

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

akoro

2018/12/26 08:57

二行目で、Undefined variableのエラーが発生してしまいます。
m.ts10806

2018/12/27 01:05

↑上記のようなエラーを出さないための冒頭@ですよ。 そのままコピペしても当該エラーは出ません。
kunai

2018/12/27 01:51

whileの中括弧を省略すれば2行のコードなのに簡潔に書く目的でベストアンサーに選ばれないとは・・くぅ。
guest

0

「エラーが出た」なら構文ミスがほとんどです。
エラーが出た→じゃ別の方法だ だといつか詰まります。
目の前のエラー解決をすることが何よりも先決ではないでしょうか。

投稿2018/12/26 04:01

m.ts10806

総合スコア80854

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

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

akoro

2018/12/26 04:04

そうなんですね、貴重なご意見ありがとうございます。
m.ts10806

2018/12/26 04:08

はい。この先なんのエラーも解決せずに進むのは無理です。 構文ミスを指摘されているエラーなわけですから、自身の思い込みや勘違いを正すチャンスでもあるわけです。 そこでPHPマニュアル確認ですね。 独学であるなら尚更、エラー解決とPHPマニュアル確認は優先的にすべきです。 エラーが出るのは想定通り動いていないからではなく、あなたが間違った構文を利用しているからです。 つまりエラーの解決と想定通り動くかは無関係(プログラムは指示した通りにしか動かないから)ですが、目の前に起きている問題(今回はエラー)を放置していて成長はありえません。
m.ts10806

2018/12/26 10:05

せめてIDEですね。
guest

0

ベストアンサー

この手の処理は配列を作るところからですね

PHP

1$count=array_fill(1,6,0); 2for($i=1;$i<=1000;$i++){ 3 $num=mt_rand(1,6); 4 $count[$num]++; 5} 6array_walk($count,function($x,$y){ 7 echo $y.":".$x."<br>\n"; 8}); 9 10

別の考え方

じつは今回のケースは一通り文字列をつくってから数えるだけですみます
参考までに

PHP

1$num=""; 2for($i=1;$i<=1000;$i++){ 3 $num.=mt_rand(1,6); 4} 5for($i=1;$i<=6;$i++){ 6 print $i.":".substr_count($num,$i)."<br>\n"; 7}

投稿2018/12/26 03:32

編集2018/12/26 04:36
yambejp

総合スコア114968

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

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

yambejp

2018/12/26 04:37

別の考え方を追記しておきました
akoro

2018/12/26 09:01

おそらく、くり返し処理が一度しか実行されないため、0か1しか表示されません。
yambejp

2018/12/26 09:38

> おそらく え?試してないんですか? たかだか7行のサンプルなのでコピペして実行してみて下さい
akoro

2018/12/27 00:47

おそらく、は原因にかけてます。もちろん実行済みでの回答です。
yambejp

2018/12/27 00:52

そうなるとおかしいですね。 実行環境のphpのバージョンによる特殊な状況なのでしょうか 非常にシンプルなロジックなのでこれで動かないなら よほどなにか本質的な環境の問題のような気がします
akoro

2018/12/27 01:02

ご指摘いただき、環境は最低限大丈夫なはず(他のファイルは実行できているため)、という前提で、完全に新しいファイルにコピペしてみました。実行できました、ありがとうございます。 元のコピペ先は途方が試行錯誤しながら、添削を繰り返していたファイルでしたので、違う箇所で入力してしまった何かと誤反応していたのかもしれません。 お騒がせいたしました、そしてお力添えありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問