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

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

詳細はこちら
PHP

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

Q&A

3回答

1406閲覧

PHP ちょっとした質問なんですが、、、

Junpeioasis

総合スコア9

PHP

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

0グッド

2クリップ

投稿2021/03/20 06:20

PHPのfor文で、任意の数字などを表示させたいとします。
例えば、

21
321
というように。
この場合、

php

1for($x = 2 ; $x >= 0 ; $x -- ) 2 3{ 4 for($y = 3 ; $y >= $x+1 ; $y -- ) 5 { 6 echo $y-$x; 7 } 8 echo "\n"; 9} 10?>

このような文で表示できるかと思うのですが、

どの数字を入れたら任意の数字になってくれるか、
比較演算子の使い方(選び方)、
そもそものfor文の形、

自分の中ではまだ、何百通りも入れてみて、たまにそれっぽい動きをした物から辿っていくというような、人海戦術のような方法しか知りません。
プロの方々はどのようにして解決しているのでしょうか。
ぜひご教授ください。

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

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

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

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

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

m.ts10806

2021/03/20 07:09

タイトルに内容がないので具体的に要件を記載してください。 あと、 >プロの方々はどのようにして解決しているのでしょうか。 本当の意味で「プロとしての意見」となるとそれは対価が発生するものになるので書き方にはご注意を。それでご飯食べてるわけですから。
hentaiman

2021/03/20 08:18

> 自分の中ではまだ、何百通りも入れてみて、たまにそれっぽい動きをした物から辿っていくというような、人海戦術のような方法しか知りません。 考えるよりも何百通り試す方が早いんですか?
Junpeioasis

2021/03/20 08:45

考えなしに数字を当てはめてる訳じゃないです。(笑) 上級者の方がどういう考え方で解決しているのかを知りたかったんです。
hentaiman

2021/03/20 08:59

例が簡単過ぎて具体的な想像がつかないですが、普通はどんな答えが欲しいかが先にあってそれを求める為に逆算して処理を作るので質問者みたいな状況にならないです。 パラメーターをいくつか試すのはバグが見つかった時ぐらいかな
m.ts10806

2021/03/20 09:36

>何百通りも入れてみて、たまにそれっぽい動きをした物から辿っていくというような、人海戦術のような方法しか知りません。 これを「考えなしに数字を当てはめてる」と一般的には表現します。
hentaiman

2021/03/20 17:58

ちなみに質問文にあるような例題だったら二重ループは使いません
hoshi-takanori

2021/03/20 21:38

課題の選び方に難があるのでは。 今回の課題だと、コードを書く前にまず数学的あるいは数字を使ったパズル的に規則性を考えるところから始める必要がありますが、数学が得意でない人だと数学の部分で挫折してしまって適切なコードに辿り着かない気がします。 前回の課題のような具体的なデータをもとに、誰が一番若いかとか、男女それぞれの平均年齢を求めるようなのをやった方が良いのでは。
guest

回答3

0

いきなりコード書くから時間だけかかります。
先に考えて考えて、コードではなく図など手書きでもいいので考えて
そこから手を付けます。

結局コードは書いたとおりにしか動かない。

Howから入らないこと
What,Whyからきちんと詰めて理解して入っていくこと。

コードも要件を実現するための道具に過ぎないわけです。


という大前提を理解したうえで進んでみてください。


すると要件に対しても疑問が沢山出てくるはずです。

  • 任意の文字って何
  • 「例えば」をもっと具体的に出来ないか
  • 増えていくのか減っていくのか、それぞれどうなっていくのか
  • 法則性はあるのか、ないようなら自分で作れるような仕様にできないか
  • 最終的に何をゴールとするのか

and so on.

ゴールに具体性がないとそこまでの道のりも曖昧なままで
思いついたものをとりあえず書いて消して書いて消して
時間だけが過ぎていくことになります。

それが悪いとは言いませんが、「ゴールに向かってる感」はないと思います。
なぜならゴールに具体性がなく、ゴールに対する達成度も不明だから。

で、「できた」と思って条件を変えると結局思ったような結果にならない(書いた通りには動いているが)ということになります。


これに限らず、
「実はちょっと要件詰め切れてないな」という部分が少しでもあるなら
その懸念事項は早い段階で取り払って「あとはコードに起こすだけ」という状態にしてください。

どんなミニマムなコードであっても、何かを満たすために組まれるわけですから、そこから先に考える癖をつけることによって、活きるコードになってきます。

投稿2021/03/20 07:22

m.ts10806

総合スコア80875

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

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

0

回答

おそらく、プログラムの作り方を誤解しています。
一つ前の質問でも回答しましたが、まずは体系的に学習することを強くお勧めします。

自分の中ではまだ、何百通りも入れてみて、たまにそれっぽい動きをした物から辿っていくというような、人海戦術のような方法しか知りません。
プロの方々はどのようにして解決しているのでしょうか。

プロに限らず学習者でも一般的には、

  1. 何を実現したいかを明確にして、ゴールを設定する
  2. ゴールに到達するための具体的な仕様を考える
  3. 仕様のロジックを構築する(最初のうちはフローチャートを書くのが楽)
  4. ロジックをコードに落とし込む

という流れでプログラムは作られます。
(学習者の場合は、1は教科書で示されている場合が多いです。)

一方で質問者さんは(質問を見てる限りでは)、

  1. 仕様をなんとなく把握する
  2. 何となく勘と経験でコードを書いて見る
  3. 1を満たすまで勘で試行錯誤する
  4. クリアしたと思ったら何となく把握していた仕様に穴があって2に戻る

と言う形で作っているように見えます。
この方法でも才能があったり、膨大な時間を費やせばプログラムを作れるようにはなるのですが、
初学者にはお勧めし難いというか時間がかかる割に得られるノウハウが無いという厳しい方法です。
(職業プログラマにもこういう人はたまにいますが、結構大変そうです)

今回のケースの場合

今回のケースであれば、
まずは仕様を日本語に落とし込むところからスタートしないといけないです。

具体的には、

PHPのfor文で、任意の数字などを表示させたいとします。 例えば、 1 21 321

ではふわふわしすぎでゴールが不明瞭(例えば、n=10,m=100の時にどの様な描画を行えばいいのかの解釈が分かれる)なので、これを仕様に落とし込むと以下のようになります。

仕様 任意の整数値nとmが入力値として与えらえれ場合、場合に以下の規則からなる文字列を出力する 1. nの後には改行コードを表示する 2. 1行目の数値はnのみを表示する 3. 2行目以降はnとmの間に存在する整数値を行ごとに1づつ加算し、左から降順で表示する 4. 最初の整数値がmの行まで描画を継続し、行を増やす 例 n=1,m=3の場合の表示結果 1 21 321

みたいな感じです。
ここまで落とし込めば、例えばn=10,m=100の時にどの様なゴールにたどり着けばいいのか?という疑問にも即座に回答が出来る状態になりますし、自分で答え合わせ(=テストとデバッグ)が出来るようになります。

繰り返しになりますが、
プログラミングではコードを書く前に、ゴールと仕様を正確に定義する能力が必要なのです。

訓練方法

アルゴリズムについて学習すると、

2. ゴールに到達するための具体的な仕様を考える 3. 仕様のロジックを構築する(最初のうちはフローチャートを書くのが楽) 4. ロジックをコードに落とし込む

について練習問題を通して学習/訓練出来ます。
1の「ゴールを設定する」については直接は学べませんが、問題文として提示されているゴールから学べる部分も多いです。

残念なことに、PHPの入門書にはこの辺りの記述がすっぱり抜けているものが多いです。(複雑なアルゴリズムを習得しなくてもサンプル程度のアプリケーションなら作成できる&webアプリケーション特有の仕組みを覚えないといけないので入門書では範囲的に厳しい)

ざっと探した限りだと
paizaラーニングPHP基礎編はその辺りもカバーしてそうな雰囲気でした。(受講はしたことが無いのであくまで印象です)

個人的には少し遠回りになりますが、C言語Javaあたりで一通りアルゴリズムとプログラミングの構築方法を学んだあとにPHPに戻ってくるのが効率が良いと思います。

C言語は長く教育用途でも使われている言語で、
定番のアルゴリズムとその練習問題が豊富に揃っているため、
仕様の定義とそこからコードを起こすという訓練がしやすいです。
C言語の入門書なら、ほぼ確実にアルゴリズムの練習を通してC言語の理解を深めるという構成になっています。
(専門学校や大学などでいまだにC言語を学習するのはこの辺の理由が大きいと思われます。)

C言語なら図書館や大型の書店なら高確率で入門書が置いてあるので、
やさしいCやその他のC言語の入門書を使ってアルゴリズムの訓練をしてみてください。

ポインタで引っかかる事も多いですが、引っかかるところまでの練習問題をクリア出来るようになるだけでも、プログラムの構築方法に関する理解度が大きく深まると思いますよ。

投稿2021/03/20 15:08

tanat

総合スコア18727

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

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

0

プロの方々はどのようにして解決しているのでしょうか。

Web 系のプロ前提で回答します。

まず、質問から与えられた条件と縛りは以下の通りと読み取れます。

for を使用して、以下の通り出力せよ 1 21 321

ほとんど縛りは無いようですね。

プロがこれを見たときには、隠れた制限は2つかなぁ。。。
・ビューとロジックを分ける
・計算量をなるべく少なくする
で、出来上がりはこんな感じ

php

1<?php 2$arr = [ 3 '1', 4 '21', 5 '321', 6]; 7$count = count($arr); 8 9for($i = 0; $i < $count; ++$i){ 10 echo $arr[$i] . PHP_EOL; 11}

必要に応じて、ロジックの部分の規則性を表現するのであれば、$arr を構成する制限を整理します。

これに関しては tanat さんが回答を書いてくれているので改めて書きませんが、読み解きに失敗すると当初の設計から大きく外れた物が出来上がります。

php

1for($n = 0; $n < 3; ++$n){ 2 $ans = 1 + 2 * $n + 3 * $n ** 2 + 4 * $n ** 3 + 5 * $n ** 4 + 6 * $n ** 5; 3 $arr[] = mb_convert_kana($ans, 'N'); 4} 5 6foreach($arr as $str){ 7 echo $str . PHP_EOL; 8}

*for で書きたくなかったので foreach で出力するように変更しています。

これを拡張して4行目を表示させると

1 21 321 2005

となり、Junpeioasis さんの【イメージした予想】とは異なるのではないでしょうか?

プロはここがズレないように顧客と入念に意識合わせします。

まぁ、求めてる回答じゃないだろうけど、面白い式見つけたから回答書きたかったんだよ!

投稿2021/03/20 20:34

編集2021/03/20 21:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tanat

2021/03/21 19:46

mb_convert_kana()にこんな使い方があったとは
退会済みユーザー

退会済みユーザー

2021/03/21 23:31

今回用に調べました。変換フラグの立て方が独特ですね。 あやうく関数一つ作るとこだったw
K_3578

2021/03/22 01:04

>面白い式見つけたから回答書きたかったんだよ! 個人的には知的資産価値の高いこういう回答どんどん増えて欲しいです。(+1)
退会済みユーザー

退会済みユーザー

2021/03/22 01:54

ここで探すんです。 http://oeis.org/ で、知っていたかのように答えるw *実はだれかがどっかの回答でこのサイトを紹介してました。インターネットってすごい! 個人的には、(この回答の解としては微妙だけど) Web 系のプロの思考として、ビューとロジックの分離の言及の方をほめてほしい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問