知らなきゃ現場で活躍できない！　PHPの繰り返し処理(初学者の方向け)

# はじめに
PHPの基本をこの記事で書いていきます。
PHPの初学者の方向けの記事です。実際にコードを書いたりして
実際の挙動などを確認してみてください。

# 環境
MAMPをインストールします。
エディタはVScodeです。

# 環境構築方法
MAMPの環境構築が動画でわかりやすく載っていました。
PHPで出力する時はMAMPで出力するのでこちらを確認してください。

https://www.youtube.com/watch?v=I9xgwLfNnD4&list=PLErg7aSNT21xAVbJAEWS1oxgGLL__ySK2


# バージョン
以下のバージョンで挙動を確認しました。

![スクリーンショット 2022-03-31 1.32.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/a3a83f23-1ba1-6e36-7d77-7d8531989048.png)

# 繰り返し処理
繰り返し何度も処理がされる処理のことです。

## for文
繰り返し処理の代表で、これが理解できれば他の繰り返し処理を理解できます。
理由は***他の繰り返し処理はfor文を応用***しているからです。

これがあると何行も繰り返しコードを書かずに済みます。
効率化させるためにプログラミングをするのに、
非効率にめんどくさいことをすると何のためにプログラミングをやるんだとなってしまいます。

書き方は
```php
for (初期化式; 判定式; 変化式)　{
//  実行内容   
}
````

これを当てはめて0から5を出力します。

```php
for ($count = 0; $count < 5; $count++){
    echo $count. "<br>";
}
//0
//1
//2
//3
//4
```
***$count = 0;は初期化式***です。　***$count < 5は判定式***で、
***５より小さい数が出力***されます。

***$count++で+1変化していく***意味です。
変化式は初期化式の段階では処理はされないです。

### break
繰り返し処理を止めるために```break```を使います。
```php
for($num = 0; $num < 20;$num ++ ){
   if($num === 10){
    
   }
   echo $num. "<br>";
}
//19まで出力
```
次にbreakを入れて処理を9で止めます。
```php
for($num = 0; $num < 20;$num ++ ){
   if($num === 10){
    break;
   }
   echo $num. "<br>";
}
//9まで出力
```
6000円以上働いたら帰るプログラムを出力してみます。
時給2000円計算で8時間労働を家庭します。
```php
<?php
$money = 0;
for ($hour = 1; $hour <= 8; $hour++) {
    $money = $hour * 2000;
    if ($money > 6000) {
        echo "今" . $hour . "時間働いて" . $money . "円です。6000円以上働いたから帰る!";
        break;
    }
    echo "今" . $hour . "時間働いて" . $money . "円です</br>";
}
//今1時間働いて2000円です
//今2時間働いて4000円です
//今3時間働いて6000円です
//今4時間働いて8000円です。6000円以上働いたから帰る!
```

次に***繰り返しの中の繰り返しを使います。***
マラソンの処理をして見ていきます。
1日8時間走って1時間10km走って1時間あたり2回休憩がある過酷なマラソンを想定します。
```php
$meter = 0;
$rest = 0;
for ($hour = 0; $hour <= 8; $hour++) {//時間のループ2回
    $meter = $hour * 10000;
    for ($i = 1; $i <= 2; $i++) {//休憩のループ2回
        $rest++;
        if ($rest > 10) {
            echo "今" . $rest . "回休憩して" . $meter . "メートル走ったのでおしまい";
            break 2;//２つ上の繰り返しで中断
        }
    }
    echo "今" . $hour . "時間走って" . $meter . "メートル走った<br>";
}
//今0時間走って0メートル走った
//今1時間走って10000メートル走った
//今2時間走って20000メートル走った
//今3時間走って30000メートル走った
//今4時間走って40000メートル走った
//今11回休憩して50000メートル走ったのでおしまい
```

### continue
continueはbreakに比べて緩やかにスキップします。
```php
for($num = 0; $num < 20;$num ++ ){
    if($num === 10){
     continue;
    }
    echo $num. "<br>";
 }
//１０だけがスキップされて表示
```
今回の場合だと10だけがスキップされます。
ピッチャーの投げたイニングで次の日登板していいかダメかをチェックするプログラムを実行していきます。
5回まで投げたら次の日投げることはできないプログラムです。

```php
for ($inning = 1; $inning <= 9; $inning++) {
    if ($inning >= 5) {
        echo "今" . $inning . "回投げた。 次の日は登板できません。<br>";
        continue;
    }
    echo "今" . $inning . "回投げた。 次の日は登板できます。<br>";
}

//フルで100球まで投げれるのでbreakで終わらせることはできない

//今1回投げた。 次の日は登板できます。
//今2回投げた。 次の日は登板できます。
//今3回投げた。 次の日は登板できます。
//今4回投げた。 次の日は登板できます。
//今5回投げた。 次の日は登板できません。
//今6回投げた。 次の日は登板できません。
//今7回投げた。 次の日は登板できません。
//今8回投げた。 次の日は登板できません。
//今9回投げた。 次の日は登板できません。
```


# foreach
***複数の値、配列の要素をまとめて処理したいときに使われる***のがforeach文です。

```php 
foreach ($配列の変数 as　$変数 ){
   実行内容;
} 
```

これを当てはめて実行してみます。
サッカー選手のリストを出力します。

```php
$player_list = ["メッシ","ロナウド"," ネイマール"];

foreach ($player_list as $player){
    echo $player. "<br>";
}
//メッシ
//ロナウド
//ネイマール
```
$配列の変数は$player_listで$変数は$playerで好きに決められます。

### foreachの中で配列のkeyを使う方法
foreachの中で配列のkeyを使う方法を説明します。

```php
foreach ($配列の変数　as $キーの変数 => $変数){
    実行内容;
} 
```
これを先ほどのサッカー選手に当てはめてみましょう。
一緒にプレーしたい選手ということで１人出力させてみます。

メッシとプレイしたいなら
```php
$player_list = ["メッシ","ロナウド"," ネイマール"];

foreach ($player_list as $key => $player){
    if ($key === 0){ //0は配列の添字
        echo $player. "とプレイしたい<br>";
    }
}
//メッシとプレイしたい
```

### 連想配列でも使える
連想配列でも使えます。選手を英語名から日本語に変換します。
```php
$player_list = [
    "Messi" =>"メッシ" ,
    "Ronald"=>"ロナウド" ,
    "Neymar"=>"ネイマール",
];

foreach ($player_list as $key => $player){
    if ($key === "Ronald"){ 
        echo $player. "とプレイしたい<br>";
    }
}
//ロナウドとプレイしたい
```

### foreach文の中で配列の要素の値を変える
foreach文の中で配列の要素の値を変えることをやっていきたいと思います。
フルーツの価格から２割引きする処理をします。
パターンが２パターンあるみたいなので、１パターン目をみていきます。

```php
$fruits = [
    "apple" => 100,
    "orange" => 150,
    "pineapple"=>300, 
];

foreach ($fruits as $fruit){
  $fruit = $fruit * 0.8;
}
echo print_r($fruits). "<br>";
//Array ( [apple] => 100 [orange] => 150 [pineapple] => 300 ) 1
```
値が変わっていないので、書き換えてみます。
```参照渡し```という方法があるみたいです。
```&```を使ってforeachループ内で要素を```参照渡し```すると、
***その要素を直接変更できます***。
こうして、ループの後に元の配列が更新された状態で残ります。

```php
$fruits = [
    "apple" => 100,
    "orange" => 150,
    "pineapple"=>300, 
];

foreach ($fruits as &$fruit){   //&をつける
  $fruit = $fruit * 0.8;
}
echo print_r($fruits). "<br>";
//Array ( [apple] => 80 [orange] => 120 [pineapple] => 240 ) 1
```
```&をつけた```だけで値が変わりました。

もう一つのやり方は***配列の大元を書き換える***やり方です。
この場合だと***fruitsを書き換える***ことになります。

```php
$fruits = [
    "apple" => 100,
    "orange" => 150,
    "pineapple"=>300, 
];

foreach ($fruits as $key => $fruit){
  $fruits[$key] *= 0.8;
}
echo print_r($fruits). "<br>";
//Array ( [apple] => 80 [orange] => 120 [pineapple] => 240 ) 1
```

### 繰り返し処理の中で繰り返し処理
繰り返し処理の中で繰り返し処理を行う処理を見ていきます。
サッカー選手のリストを海外と日本で分けていきます。

大きな配列の中に配列が入っているイメージです。

```php

$player_list = [
    "major" => [
        ["大谷", 28, "エンゼルス"],
        ["イチロー", 50, "マリナーズ"],
        ["松井", 48, "ヤンキース"]
    ],
    "NPB" => [
        ["村上", 23, "ヤクルト"],
        ["田中", 34, "楽天"],
        ["近藤", 29, "ソフトバンク"]
    ],
];

foreach ($player_list as $player_league) {
    foreach ($player_league as $baseball_player) {
        echo $baseball_player[0] . "は" . $baseball_player[1] . "歳で" . $baseball_player[2] . "所属です。<br>";
    }
}
//大谷は28歳でエンゼルス所属です。
//イチローは50歳でマリナーズ所属です。
//松井は48歳でヤンキース所属です。
//村上は23歳でヤクルト所属です。
//田中は34歳で楽天所属です。
//近藤は29歳でソフトバンク所属です。
```
実際の所属チームや年齢は変わったりするのでその点はご了承ください。
かなり複雑ですが、参考資料に動画で解説されているので見てみてください。


# while
while文は何度も繰り返し処理をするためのものです。

```php
$num = 0;
while($num < 5){
    echo $num;
    $num++;
}
//01234
```
5まで繰り返し処理をされます。

### for文とwhile文の違い
for文とwhile文が紛らわしいので下に簡単な違いを説明しておきます。


⚫︎```for文```は繰り返す数が決まっていて、繰り返し回数を優先させる場合に使う

⚫︎```while文```は繰り返す数が決まっていなくて、条件を優先的に繰り返したい時に使う

## do..while文
これはあまり使わないので説明は省きます。
下に記事を載せておくので読んでみてください。

https://www.javadrive.jp/php/for/index5.html





# PHPが全くわからない人向けの記事
https://qiita.com/Hashimoto-Noriaki/items/3d89e79c1f031afc7b96

https://qiita.com/Hashimoto-Noriaki/items/9ba6af2960a6d8d6342f

https://qiita.com/Hashimoto-Noriaki/items/0d9b2f03ec165e3452b8

https://qiita.com/Hashimoto-Noriaki/items/dfb76d440a64eccba95d

https://qiita.com/mackeyTA/items/069900b5c2366fb30e3a

# 参考資料
https://techacademy.jp/magazine/4978#sec1

https://www.youtube.com/watch?v=qiCROoo5rBA&list=PLErg7aSNT21xAVbJAEWS1oxgGLL__ySK2&index=5

https://www.youtube.com/watch?v=16yt3cQPFOo&list=PLErg7aSNT21xAVbJAEWS1oxgGLL__ySK2&index=6