うまく写るか分かりませんが、以下の通りのパターンをPHPでforループを使って
作りたいのですが、ヒントがなく、前に進めません。。
すべての行に10個あり
一行目は両端に*マークが一個ずつ、
二行目は両端の*マークが二個ずつ、
三行目は両端の*マークが三個ずつ..
というパターンです。
全部で10行あります。
- *
* *
** **
******
******
** **
* *
- *
よろしくお願いします。
以下に自分の書いたコードを載せますが、機能していません。。
<?php
function myForloop(){
echo"<table>";
for($x =0;$x<=9; $x++){
echo "<tr>";
if($x==0 || $x==10){
echo "<td>*</td>";
}
else{
echo"<td>"." "."</td>";
}
for($y =0;$y<=9; $y++){
if($x==0){
echo "<td>"*"</td>";
}else{
echo " <td>"*"</td>";
}
}
echo "</tr>";
}
echo "</table>";
}
myForloop();
?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
まずfor文は基本的にバグを埋め込む諸悪の根源なので、
どうしてもforかwhileに頼らなきゃならない理由があるんです!いくらでも罵ってください!馬鹿でごめんなさい!生まれてきてごめんなさい!!
…と毎回懺悔するくらいの気持ちで使いましょう。
ちなみに私がさくっと書いたコードは下記です。
<?php
$hoge = range(1, 10);
$spaces = array_map(function($it){
return (int)round(abs($it - 5.5) - 0.5);
}, $hoge);
$patterns = array_map(function($it){
$seed = str_repeat("*", 5 - $it) . str_repeat(" ", $it);
return $seed . strrev($seed);
}, $spaces);
$ php -a
php > $hoge = range(1, 10);
php > $spaces = array_map(function($it){
php ( return (int)round(abs($it - 5.5) - 0.5);
php ( }, $hoge);
php > $patterns = array_map(function($it){
php ( $seed = str_repeat("*", 5 - $it) . str_repeat(" ", $it);
php ( return $seed . strrev($seed);
php ( }, $spaces);
php > var_dump($patterns);
array(10) {
[0]=>
string(10) "* *"
[1]=>
string(10) "** **"
[2]=>
string(10) "*** ***"
[3]=>
string(10) "**** ****"
[4]=>
string(10) "**********"
[5]=>
string(10) "**********"
[6]=>
string(10) "**** ****"
[7]=>
string(10) "*** ***"
[8]=>
string(10) "** **"
[9]=>
string(10) "* *"
}
ちょっと慣れないと読みづらいと思いますので、for文で書きなおしてみます。
<?php
$patterns = [];
for ($i = 1; $i <= 10; $i++) {
$space_num = (int)round(abs($i - 5.5) - 0.5);
$seed = str_repeat("*", 5 - $space_num) . str_repeat(" ", $space_num);
$patterns[] = $seed . strrev($seed);
}
php > $patterns = [];
php > for ($i = 1; $i <= 10; $i++) {
php { $space_num = (int)round(abs($i - 5.5) - 0.5);
php { $seed = str_repeat("*", 5 - $space_num) . str_repeat(" ", $space_num);
php { $patterns[] = $seed . strrev($seed);
php { }
php >
php > var_dump($patterns);
array(10) {
[0]=>
string(10) "* *"
[1]=>
string(10) "** **"
[2]=>
string(10) "*** ***"
[3]=>
string(10) "**** ****"
[4]=>
string(10) "**********"
[5]=>
string(10) "**********"
[6]=>
string(10) "**** ****"
[7]=>
string(10) "*** ***"
[8]=>
string(10) "** **"
[9]=>
string(10) "* *"
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
$str = str_repeat(' ', 10);
$result = '';
for($i=5; $i>0; $i--){
$tmp = substr_replace(substr_replace($str, str_repeat('*', $i), 0, $i), str_repeat('*', $i), -$i). "\n";
$result = $tmp. $result. $tmp;
}
echo($result);
こんな感じでしょうか。
function myForloop(){
$pre='';
$suf='';
echo"<table>";
for($row=0; $row<5; $row++){
$htmlL = '';
$htmlR = '';
for($col=0; $col<5; $col++){
if($col<=$row){
$htmlL .= "<td>*</td>";
$htmlR = $htmlR. "<td>*</td>";
} else {
$htmlL .= "<td> </td>";
$htmlR = "<td> </td>". $htmlR;
}
}
$pre .= "<tr>". $htmlL. $htmlR. "<tr>";
$suf = "<tr>". $htmlL. $htmlR. "<tr>". $suf;
}
echo $pre.$suf."</table>";
}
myForloop();
質問にコードが追加されたのでテーブルで出力する方式も追記します。
今回の場合縦横ともに10回繰り返すわけですが、問題は1~5行目と6~10行目で表示する内容の法則が逆になるところかと思います。
そこで1行目と10行目、2行目と9行目・・・が同じという点に注目して
1行目を作るときに10行目も作ってしまえばいいと考えました。
列に関しても同じで1列目を作る時に10列目をつくれば行列ともに1~5の範囲でループさせれば済みます。
あとは*
か
を判別する条件$col<=$row
(列番号が行番号以下の場合に*
)を考えるという感じでしょうか。
ところでこれ色んな考え方のできるなかなかいい問題と思うんですが・・・授業か何かの課題ですか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.38%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
kei344
2016/05/21 07:05
ご自身で書かれたコードを質問文に追記いただいたほうが回答を得られやすいと思います。
2016/05/21 07:19
こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。
kei344
2016/05/21 07:38
コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
sumomomo
2016/05/21 07:51
すべて対応いたしました。