🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

12294閲覧

for文の中でカウンタ変数以外の変数を動かしていて悩んでしまっています

shun_nosuke

総合スコア5

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/10/15 09:51

for文の中での別変数の扱い

PHPを勉強中の初心者ですが、for文の中でカウンタ変数とは別の変数を動かすことがうまくできず、無理やり解決させたのですが、これでいいのか悩んでおります。

課題としては、7枚のくじを4人で引いていって、外れくじ(=x)を引いたらその人はいなくなるというルールで、くじを最後まで順番にひいたあと、残る人の番号をだすという内容です。最初はくじを引く順番で増える変数$iを人数で割った余りで誰が引いたかを見れると思っていたのですが、unsetでデータを削除したらそれができないことに気づきまして別の変数$jを入れることにしました。悩んだ結果、以下のようなソースになり、一応結果としては望む内容になったのですが、、、これは無駄が多いのでは、と感じております。

コードまで書いていただこうとは思ってないのですが、こういう場合にどう考えるのがよいか、教えていただけると助かります。

※実際に取り組んでいる課題としては全く別の内容です。こちらに掲載するために詰まった箇所に絞って内容を変えました。

該当のソースコード

PHP

1$members= [1,2,3,4]; 2$cards = ["a","a","x","a","a","a","x"]; 3$num_of_members = 4; 4$num_of_card = 7; 5 6$j=0; 7for($i=0; $i<$num_of_card; $i++){ 8 if($cards[$i] == 'x'){ 9 unset($members[$j]); 10 $members = array_values($members); 11 $num_of_members -= 1; 12 if($j == $num_of_members){ 13 $j = 0; 14 } 15 16 }else{ 17 $j += 1; 18 if($j == $num_of_members){ 19 $j = 0; 20 } 21 } 22} 23foreach ($members as $member){ 24 echo $member."\n"; 25}

試したこと

unsetで要素を削除して、array_valuesでキーを振りなおしたのがダメだったのか?と思って、やり方を変えてみたのですがうまくいきませんでした。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/10/15 09:56

雰囲気が paiza なのですが、もし paiza であれば回答者にも迷惑がかかることを理解していますか? その他の競技プログラムであっても利用規約次第で回答者に迷惑がかかります。出典元を明らかにしてください。
yambejp

2019/10/15 10:02 編集

考え方: member:1=a・・・OK member:2=a・・・OK member:3=x・・・NG→$membersを["1","2","4"]とする? member:4=a・・・OK 先頭にもどって member:1=a・・・OK member:2=a・・・OK member:4=x・・・NG→$membersを["1","2"]とする? ということでよいのでしょうか? 結果としてほしいのはなんですか?
shun_nosuke

2019/10/15 10:06

ご指摘ありがとうございます。おっしゃる通り、課題のもとはPaizaさんです。悩んだ内容のもととなったのはこちらの問題です。 https://paiza.jp/works/mondai/skillcheck_archive/word_chain?language_uid=php こちらの問題ですが、レベルアップ問題集にあったもので、「レベルアップ問題集にある問題については、ユーザー同士で解答を教え合ったり、コードを公開したり、授業や研修で使用することは何の問題もありません。是非、ご活用ください。」とあったので、問題ないかと思っておりました。https://paiza.jp/works/mondai ご面倒をおかけして申し訳ありませんが、ご確認いただけますと幸いです。また、もしこの内容で問題があった場合は、お手数ですが削除頂けますと幸いです。 「このくらい変えていれば大丈夫では?」と素人判断をしてしまったのですが、Paiza様だけでなく回答者様にも迷惑がかかることを理解できておりませんでした。今後はしっかり気を付けたいと思います。この度はご指摘いただきまして、有難うございます。
shun_nosuke

2019/10/15 10:13

te2ji様 申し訳ありません。初めての投稿だったため、運営の方からのご連絡だと思ってしまっておりました。 yambejp様 ご回答ありがとうございます。先の方にご指摘を頂いたのですが、この問題を掲載していいのか判断がつかないので、一旦解決とさせて頂こうと思います。
yambejp

2019/10/15 10:16

丸写しじゃなくてロジックを確認したいというだけなら そんなに気にすることもないような気もしますが、 なにかモヤモヤするなら、質問を閉じてしまってください
shun_nosuke

2019/10/15 10:19

yambejp様 コメント有難うございます。初めての投稿でまだルールがわかっていなかったのと、他の方にご迷惑をおかけしたくないので、閉じさせていただきました。改めまして、ご回答ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/10/15 12:20

paiza のスキルチェックの問題であれば paiza 規約違反ですがそうでないのであれば質問に「問題のないこと」を記述して質問すると良いです。 回答者が戸惑うことはなくなります。
guest

回答3

0

paiza の問題を解いてました。
で、回答をもとに質問用に加工してみました。

php

1<?php 2$members= [1,2,3,4]; 3$cards = ["a","a","x","a","a","a","x"]; 4 5$j=0; 6$x_falg = TRUE; 7foreach($cards as $k => $v){ 8 if($x_falg === FALSE){ 9 $j += 1; 10 } 11 if($j >= count($members)){ 12 $j = 0; 13 } 14 if($x_falg === TRUE || $v !== 'x'){ 15 $x_falg = FALSE; 16 } else { 17 array_splice($members,$j,1); 18 $x_falg = TRUE; 19 } 20} 21echo count($members).PHP_EOL; 22foreach($members as $v){ 23 echo $v.PHP_EOL; 24}

$j の取り扱いがちょっと厄介かもしれません。
member を配列から削除したときはカウントを進めず、人数を超過したときは初期値に戻す操作が必要です。

投稿2019/10/15 12:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shun_nosuke

2019/10/15 13:02

te2jiさん 質問する際の注意点を教えてくれた上に、問題を確認していただき、しかも回答をアレンジまでしてくれて。。本当に有難うございます。驚いて声出ました。感動しました。頂いた書き方が、私の想定と全然違うので、じっくり読んで理解をしようと思います。心より感謝いたします。もし機会がまたありましたら、ご指導いただけますと嬉しいです。有難うございました!
退会済みユーザー

退会済みユーザー

2019/10/15 13:11

tacsheaven さんのキューを使う方法はもっとシンプルに記述できそうです。 チャレンジしてみると良いです。
guest

0

for 文でやることがそもそも苦労する原因ではないかと思います。
問題を考えると、くじは配列で表現できますが、引く人はキューにした方が良さそうです。

一回の動作としては、

  1. 引く人のキューから一人(先頭を)取り出す
  2. くじからランダムに一つ引く(配列から取り除く)
  3. 引いたくじが外れでなければ、1. で取り出した一人を、キューの末尾に追加する
  4. この時点でくじが空か、キューが空になったら終了

という感じでしょうか。ループ継続条件(4.)を考えると、for より while 使った方が良さそうですよね。
まあ、くじの数が確定しているので、上の動作を「くじの数で」for ループさせるのもできますけど。

※4. の条件は、くじの中に外れが何枚あるか分からないからです。最悪、一人も残らない(外れが4枚以上ある)場合も考慮しなくてよいんですかね?

投稿2019/10/15 10:19

tacsheaven

総合スコア13703

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

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

shun_nosuke

2019/10/15 10:23

すみません、質問を閉じたタイミングでした。ご回答ありがとうございました!
guest

0

自己解決

こちらで掲載してよいかすぐに判断がつかないため、解決済みとさせていただきます。

投稿2019/10/15 10:16

shun_nosuke

総合スコア5

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

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

shun_nosuke

2019/10/15 10:23

すみません、質問を閉じたタイミングでした。ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問