エンジニア初学者のころの勉強方法について

# はじめに  
私がエンジニアとしてキャリアをスタートさせた時に行った演習課題とその解き方を記述します。  
エンジニアとなった最初はHTMLとPHPから勉強を始めました。  
昨今ではPHP言語が使われることは少なくなってきましたが、保守などに使うことがあること、プログラミングとはどういうものかを理解するのにコストが少ないことから、初めて触る言語としてオススメだと思います。 　
私は最初の2ヶ月くらいはPHPを触り、それからGO言語やTypeScriptなどの静的言語の学習を始めました。 
  
本稿では、お馴染みではありますが、繰り返し処理と配列について学んでいきましょう。　
PHPの繰り返し処理だけでは、面白くないので最後にGO言語を使って同じ繰り返し処理と配列を作成します。

  
  
# 準備  
PHPの実行環境を準備しましょう。  
今回の演習では、webページに九九を表示させることをゴールとします。

~~以下の記事を参考に環境を構築してください。~~  
実行環境の記事は別途公開予定です。  


# 課題  
課題は以下の順番で進めていきます。  
1. 1の段を縦に表示
1. 1の段を横に表示
1. 1の段から9の段までを縦に表示
1. 九九の表を表示
1. 別解を作ってみよう  
  
## 1. 1の段を縦に表示  
以下の完成形を目指します。

<img width="70" alt="スクリーンショット 2023-08-02 22.40.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073068/1448caa2-7453-8868-1ca3-943f507ea151.png">

まずは、for文を用いて配列に1の段を格納していきます。
ここではわかりやすく配列の添字（key）は1から始めています。

```php 
$array = [];

for ($i = 1; $i < 10; $i++) {
    $array[$i] = "1 × " . $i;
}
```
配列が完成したら、続いてHTMLで表示してみましょう。 
ここで注意が必要なのは、tableタグの使い方です。
`<tr>`で囲うと改行されるということと、各データを`<td>`タグで囲う必要があることです。
さらに、`PHP`と`HTML`で記載する部分が分かれていると可読性が向上します。 
```php
<table border="1">
    <?php for ($i = 1; $i <= count($array); $i++) : ?>
        <tr>
            <td>
                <?php echo $array[$i]; ?>
            </td>
        </tr>
    <?php endfor ?>
</table>
```


## 2. 1の段を横に表示  
続いては以下の形を書いてみましょう。 
<img width="500" alt="スクリーンショット 2023-08-02 22.55.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073068/8b35727f-49c4-dcd2-7f59-bb9ea6b62bcd.png">
配列は先ほどと同じものを利用します。  
```PHP
<table border="1">
    <tr>
        <?php for ($i = 1; $i <= count($array); $i++) : ?>
            <td>
                <?php echo $array[$i]; ?>
            </td>
        <?php endfor ?>
    </tr>
</table>
```
違いが分かりましたか？  
`<tr>`タグをfor文の外側に記述しました。


`HTML`の書き方を少し工夫するだけでできました。



## 3. 1の段から9の段までを縦に表示
縦長でスクリーンショットは準備できませんでしたが・・・
まずは配列に1の段から9の段を格納してみましょう。
少しややこしいですが、`for文`を2回使うことで簡単に作成できます。
```php
$array = [];
for ($j = 1; $j < 10; $j++) {
  for ($i = 1; $i < 10; $i++) {
    $array[$j][$i] = $j . " × " . $i;
  }
}
```
これで`$j × $i`が配列に格納されました。  
それではこの配列をHTMLで描写してみます。  
配列を作成した時と同様に、for文を2回使って描写します。

```php
<table border="1">
    <?php for ($j = 1; $j <= count($array); $j++) : ?>
        <?php for ($i = 1; $i <= count($array); $i++) : ?>
            <tr>
                <td>
                    <?php echo $array[$j][$i]; ?>
                </td>
            </tr>
        <?php endfor ?>
    <?php endfor ?>
</table>
```





  
## 4. 九九の表を表示
以下の表を作っていきます。
<img width="500" alt="スクリーンショット 2023-08-02 23.15.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073068/1b998a55-3d3f-e3d2-17af-35536ac709a7.png">
  
配列は3で作ったものと同じものを使います。

ここで注意が必要なのは、1の段、2の段と描写していくのではなく、  
`<tr>` `<td>1 × 1</td>` `<td>2 × 1</td>`・・・ `<td>9 × 1</td>` `</tr>`と記載する必要があることです。  
```php
<table border="1">
    <?php for ($i = 1; $i <= count($array); $i++) : ?>
        <tr>
            <?php for ($j = 1; $j <= count($array); $j++) : ?>
                <td>
                    <?php echo $array[$j][$i]; ?>
                </td>
            <?php endfor ?>
        </tr>
    <?php endfor ?>
</table>
```
  
## 5.別解を作ってみよう
1〜4まではいかがだったでしょうか。  
配列と繰り返し処理はプログラミングで必須となるので、1〜4がすぐにできるようにトレーニングしましょう。  
さらにここでは、上記の別解をいくつか提案してみます。  
- 九九の配列をfor文を1つで作成してみましょう
- 九九の配列をforeachを使って表示してみましょう
  
他にも皆さんが、この処理ってこのやり方でも書けるのかな？と思ったらぜひ書いてみましょう！

# GO言語での九九表の作成  
PHPで作成した九九の表をGO言語でも作成してみようと思います。  
PHPのようにHTMLと同時に書くことはできないので、コンソールで表示させてみましょう。  
まずは、配列に九九の表を格納します。

```go
package main

import "fmt"

var slice [][]string

func makeMultiple() {
	slice = make([][]string, 9)
	for j := 0; j < 9; j++ {
		slice[j] = make([]string, 9)
		for i := 0; i < 9; i++ {
			slice[j][i] = fmt.Sprintf("%v × %v", j+1, i+1)
		}
	}
}
```
`func main()`で`slice`を取得できるようにグローバルの変数として`slice`を定義しています。  
また、`makeMultiple()`関数で九九をスライスに格納するためにスライスの`capacity`と`length`を初期化する必要があります。  
また`slice`は二次元のスライスなので、for文の中で`slice[j]`の初期化も行なっています。  
これらの初期化を実行しないとエラーとなって動作しません。

続いて格納した九九をコンソールで表示していきます。  
```go
func main() {
	makeMultiple()
	for i := 0; i < 9; i++ {
		for j := 0; j < 9; j++ {
			fmt.Printf("%v ", slice[j][i])
		}
		fmt.Println()
	}
}
```
`slice`はグローバルで定義しているので`main()`関数の中で`makeMultiple()`関数を実行し`slice`に九九を格納します。  
続いて格納した`slice`をfor文による繰り返し処理と`fmt.Printf()`を用いて出力しています。  
fmtパッケージの`Print関数`は、`printf()`では改行されないので、jが9回繰り返された段階で、`fmt.Println()`を実行して改行を行なっています。

実行結果は以下のとおりとなりました。  
<img width="500" alt="スクリーンショット 2023-08-05 21.53.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073068/e9868edc-ca7d-0b48-e581-4398f8a16ffd.png">

続いて同様の処理を`for range`を使って出力してみます。  
```go
package main

import "fmt"

var slice [][]string
var changedSlice [][]string

func makeMultiple() {
	slice = make([][]string, 9)
	for j := 0; j < 9; j++ {
		slice[j] = make([]string, 9)
		for i := 0; i < 9; i++ {
			slice[j][i] = fmt.Sprintf("%v × %v", j+1, i+1)
		}
	}
}

func main() {
	makeMultiple()
	changedSlice = make([][]string, 9)
	for i := 0; i < 9; i++ {
		changedSlice[i] = make([]string, 9)
		for j := 0; j < 9; j++ {
			changedSlice[i][j] = slice[j][i]
		}
	}
	for _, row := range changedSlice {
		for _, val := range row {
			fmt.Printf("%v ", val)
		}
		fmt.Println()
	}
}
```

先ほど作成した`makeMultiple()`関数で格納された九九をそのまま出力すると縦横が反対になってしまいます。  
そのため、今回は`makeMultiple()`関数を書き直すのではなく、`slice`の縦と横を変換した`changedSlice`を作成し、`for range`を使って出力を行いました。  

 
# 余談  
プログラミングの学習を進めていくと、`パソコンを汚さないため言語のインストールはしない方が良い。`
という意見をよく聞くようになると思います。  
この記事を執筆するにあたり、自宅のパソコンを使っていますがPHPの実行環境を構築すると多くのパッケージをインストールすることとなってしまうため、`DockerDevContainer`を利用した実行環境を構築しました。  
`DockerDevContainer`の環境構築にあたり、以下の記事がとても参考になりました。
ご興味のある方は以下の記事を参考に環境構築してみてはいかがでしょう！

https://zenn.dev/harurow/articles/c903de5f479a57