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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

PHP

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

Q&A

解決済

2回答

1315閲覧

PHPでForループを使って、パターンをつくる

sumomomo

総合スコア15

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

PHP

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

0グッド

0クリップ

投稿2016/05/20 21:56

編集2016/05/20 22:51

うまく写るか分かりませんが、以下の通りのパターンをPHPでforループを使って
作りたいのですが、ヒントがなく、前に進めません。。

すべての行に10個あり
一行目は両端に*マークが一個ずつ、
二行目は両端の*マークが二個ずつ、
三行目は両端の*マークが三個ずつ..

というパターンです。
全部で10行あります。

  • *








  • *

よろしくお願いします。

以下に自分の書いたコードを載せますが、機能していません。。

php

1<?php 2function myForloop(){ 3 4echo"<table>"; 5for($x =0;$x<=9; $x++){ 6 echo "<tr>"; 7 if($x==0 || $x==10){ 8 echo "<td>*</td>"; 9 10 } 11else{ 12 echo"<td>"." "."</td>"; 13 } 14for($y =0;$y<=9; $y++){ 15 if($x==0){ 16 echo "<td>"*"</td>"; 17 }else{ 18 echo " <td>"*"</td>"; 19 } 20 21 } 22 echo "</tr>"; 23} 24echo "</table>"; 25} 26myForloop(); 27?>

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

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

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

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

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

kei344

2016/05/20 22:05

ご自身で書かれたコードを質問文に追記いただいたほうが回答を得られやすいと思います。
kei344

2016/05/20 22:38

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
sumomomo

2016/05/20 22:51

すべて対応いたしました。
guest

回答2

0

ベストアンサー

まずfor文は基本的にバグを埋め込む諸悪の根源なので、
どうしてもforかwhileに頼らなきゃならない理由があるんです!いくらでも罵ってください!馬鹿でごめんなさい!生まれてきてごめんなさい!!
…と毎回懺悔するくらいの気持ちで使いましょう。

ちなみに私がさくっと書いたコードは下記です。

PHP

1<?php 2$hoge = range(1, 10); 3$spaces = array_map(function($it){ 4 return (int)round(abs($it - 5.5) - 0.5); 5}, $hoge); 6$patterns = array_map(function($it){ 7 $seed = str_repeat("*", 5 - $it) . str_repeat(" ", $it); 8 return $seed . strrev($seed); 9}, $spaces);

bash

1$ php -a 2php > $hoge = range(1, 10); 3php > $spaces = array_map(function($it){ 4php ( return (int)round(abs($it - 5.5) - 0.5); 5php ( }, $hoge); 6php > $patterns = array_map(function($it){ 7php ( $seed = str_repeat("*", 5 - $it) . str_repeat(" ", $it); 8php ( return $seed . strrev($seed); 9php ( }, $spaces); 10php > var_dump($patterns); 11array(10) { 12 [0]=> 13 string(10) "* *" 14 [1]=> 15 string(10) "** **" 16 [2]=> 17 string(10) "*** ***" 18 [3]=> 19 string(10) "**** ****" 20 [4]=> 21 string(10) "**********" 22 [5]=> 23 string(10) "**********" 24 [6]=> 25 string(10) "**** ****" 26 [7]=> 27 string(10) "*** ***" 28 [8]=> 29 string(10) "** **" 30 [9]=> 31 string(10) "* *" 32}

ちょっと慣れないと読みづらいと思いますので、for文で書きなおしてみます。

PHP

1<?php 2$patterns = []; 3for ($i = 1; $i <= 10; $i++) { 4 $space_num = (int)round(abs($i - 5.5) - 0.5); 5 $seed = str_repeat("*", 5 - $space_num) . str_repeat(" ", $space_num); 6 $patterns[] = $seed . strrev($seed); 7}

bash

1php > $patterns = []; 2php > for ($i = 1; $i <= 10; $i++) { 3php { $space_num = (int)round(abs($i - 5.5) - 0.5); 4php { $seed = str_repeat("*", 5 - $space_num) . str_repeat(" ", $space_num); 5php { $patterns[] = $seed . strrev($seed); 6php { } 7php > 8php > var_dump($patterns); 9array(10) { 10 [0]=> 11 string(10) "* *" 12 [1]=> 13 string(10) "** **" 14 [2]=> 15 string(10) "*** ***" 16 [3]=> 17 string(10) "**** ****" 18 [4]=> 19 string(10) "**********" 20 [5]=> 21 string(10) "**********" 22 [6]=> 23 string(10) "**** ****" 24 [7]=> 25 string(10) "*** ***" 26 [8]=> 27 string(10) "** **" 28 [9]=> 29 string(10) "* *" 30}

投稿2016/05/21 03:00

miyabi-sun

総合スコア21158

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

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

miyabi-sun

2016/05/21 03:06 編集

このコードは多数の初見の関数を使っていると思います。 公式サイトの右上の検索ボックスに関数を入力すれば簡単に確認出来ますので利用してみてください。 http://php.net/manual/ja/ プログラミングの世界、 特にPHPでは関数を知らない天才より、関数を沢山知っている凡人の方が遥かに優秀です。 積年の課題が公式サイトに乗っている1行で簡単に解決出来ることも多いので、使えそうな関数はないか探してみてください。
sumomomo

2016/05/28 00:03

Thanks for the answer! I will go through the basics again, I appreciate your advice!
guest

0

php

1$str = str_repeat(' ', 10); 2$result = ''; 3for($i=5; $i>0; $i--){ 4 $tmp = substr_replace(substr_replace($str, str_repeat('*', $i), 0, $i), str_repeat('*', $i), -$i). "\n"; 5 $result = $tmp. $result. $tmp; 6} 7echo($result);

こんな感じでしょうか。


php

1function myForloop(){ 2 $pre=''; 3 $suf=''; 4 echo"<table>"; 5 for($row=0; $row<5; $row++){ 6 $htmlL = ''; 7 $htmlR = ''; 8 for($col=0; $col<5; $col++){ 9 if($col<=$row){ 10 $htmlL .= "<td>*</td>"; 11 $htmlR = $htmlR. "<td>*</td>"; 12 } else { 13 $htmlL .= "<td> </td>"; 14 $htmlR = "<td> </td>". $htmlR; 15 } 16 } 17 $pre .= "<tr>". $htmlL. $htmlR. "<tr>"; 18 $suf = "<tr>". $htmlL. $htmlR. "<tr>". $suf; 19 } 20 echo $pre.$suf."</table>"; 21} 22myForloop();

質問にコードが追加されたのでテーブルで出力する方式も追記します。

今回の場合縦横ともに10回繰り返すわけですが、問題は1~5行目と6~10行目で表示する内容の法則が逆になるところかと思います。
そこで1行目と10行目、2行目と9行目・・・が同じという点に注目して
1行目を作るときに10行目も作ってしまえばいいと考えました。

列に関しても同じで1列目を作る時に10列目をつくれば行列ともに1~5の範囲でループさせれば済みます。
あとは* を判別する条件$col<=$row(列番号が行番号以下の場合に*)を考えるという感じでしょうか。

ところでこれ色んな考え方のできるなかなかいい問題と思うんですが・・・授業か何かの課題ですか?

投稿2016/05/20 22:29

編集2016/05/21 03:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sumomomo

2016/05/20 23:36

ありがとうございます!テーブル使ってやっていましたが、こちらの方がシンプルでわかりやすいですね。replace等は勉強したばかりで浮かんできませんでした>< *が全部左寄りになってしまっているのを改善したいと思うのですが、なにか案はありますでしょうか。 お時間ありましたら、すみませんがよろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/05/21 03:26

質問文に合わせたパターンを追記しました。
sumomomo

2016/05/27 23:14

Thank you very much for the help, I really appreciate it! It was one of the examples that our teacher showed in class but I couldn't figure it out. I will look into your code! Thanks again :)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問