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

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

ただいまの
回答率

90.47%

  • PHP

    20902questions

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

  • for

    247questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 478

Rivername

score 9

うまく写るか分かりませんが、以下の通りのパターンを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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/05/21 07:05

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

    キャンセル

  • 退会済みユーザー

    2016/05/21 07:19

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • kei344

    2016/05/21 07:38

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

    キャンセル

  • Rivername

    2016/05/21 07:51

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

    キャンセル

回答 2

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) "*        *"
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/21 12:06 編集

    このコードは多数の初見の関数を使っていると思います。
    公式サイトの右上の検索ボックスに関数を入力すれば簡単に確認出来ますので利用してみてください。
    http://php.net/manual/ja/

    プログラミングの世界、
    特にPHPでは関数を知らない天才より、関数を沢山知っている凡人の方が遥かに優秀です。
    積年の課題が公式サイトに乗っている1行で簡単に解決出来ることも多いので、使えそうな関数はないか探してみてください。

    キャンセル

  • 2016/05/28 09:03

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

    キャンセル

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(列番号が行番号以下の場合に*)を考えるという感じでしょうか。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/21 08:36

    ありがとうございます!テーブル使ってやっていましたが、こちらの方がシンプルでわかりやすいですね。replace等は勉強したばかりで浮かんできませんでした><

    *が全部左寄りになってしまっているのを改善したいと思うのですが、なにか案はありますでしょうか。

    お時間ありましたら、すみませんがよろしくお願いします。

    キャンセル

  • 2016/05/21 12:26

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

    キャンセル

  • 2016/05/28 08: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 :)

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    php mysql pagination

    各カテゴリ一覧にて、各カテゴリに当てられた記事ページ一覧の表示はできていますがそこで各カテゴリーページにて、記事が多い時を想定してページネーションを作ったんですが現在いるカテゴリで

  • 解決済

    今月と来月のカレンダーの処理をfor文で回すには

    初心者です。下記for文を書いてみたのですが、当月は出来ても翌月のはできませんでした。 どなたか教えて頂けますでしょうか。 $tsuki = '月'; $list

  • 解決済

    While と forの違いについて

    While と forの違いについて PHPを学んでいるのですが、 While と forの違い(使い分け)がいまいち良くわかりません。どのように使い分けると良いのかご教示頂け

  • 解決済

    forとforeachの違い

    基礎的な件で恐縮です。 forとforeachの違いが調べたのですが、 いまいち理解できておりません。 どなたかわかりやすくご教示頂けますと幸いです。 ご面倒を

  • 解決済

    for文で回した項目で表示させたものを別ページで表示させたい

    (要望) for文で回した複数の結果をクリックすると別ページに移行させたい。 (現状) for文の複数の結果が掲載されており横にボタンを押すと個々のリンクに飛ばしたいです

  • 解決済

    縦型のカレンダーを出力したい PHP

    最終的には画像のように送信ボタンを押したら、選択年月が曜日と合わせて テーブルで出力されるカレンダーを作りたいのですが、 月初の曜日を月末まで連続して出力する処理の書き方がわか

  • 解決済

    PHPでDBから読み出したデータを、HTMLの表(table)出力するスマートな方法

    前提・実現したいこと 要約すると「DBから取得した配列データを加工・集計して使いたいが、何度もループで回したり再度配列に入れ直して処理するのは避けたい」 PHPでDBから読

  • 解決済

    PHP 選択された年数分の日付を曜日付きで出力したい

    表題の通り日付と曜日を出力するんですが、「選択された年数分」のところが、もっとシンプルな記述にならないか考えています。 1年は365日か366日だということを踏まえてロジック

同じタグがついた質問を見る

  • PHP

    20902questions

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

  • for

    247questions

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