PHPプログラミング実践①　関数編

#はじめに#
コロナ休みで暇なので記事書いてます。
前にPHPプログラミング入門という記事を書いたので、まだみてない方はよかったらみてください。
前回の記事↓
[PHPプログラミング入門](https://qiita.com/SsS136/items/3f17a130be0485efeb41)
Twitterやってます。よかったらフォローきてください。
↓↓
[@DevTweak](https://sss136.github.io/)
低クオリティーTweakを作ってるので、よかったらリポジトリ登録してください。
↓↓
[リポジトリ](https://sss136.github.io/)

##目次##
1. 関数の実装
    1. 連想配列とは？そもそも配列とは
2. まとめ

##関数の実装##
関数の実装は簡単です。意外と。
まあこんな感じです。

```php:index.php
<?php
function test() {
    echo "こんにちは";
}
test();
?>
```

これで　こんにちは　と表示されます。戻り値なし、引数を取らない関数の場合ですね。
C言語だと戻り値があるかないかで、定義しなければなりませんでしたが、PHPではいりません。
楽でいいですね。
当たり前ですが、関数名は好きに変えられます。できるでだけこの関数が何をするものか分かるような名前にするのが基本ですね。まあ今回はめんどくさいんで名前はtestにします。

次は引数を取る関数を書いてみます。

```php:index.php
<?php
function test($id,$password) {
    echo 'idは'. $id.',passwordは'.$password.'です';
}
test('123','0000');
?>
```
出力結果は idは123,passwordは0000です　になります。

では次に戻り値がある関数を作っていきましょう。

```php:index.php
<?php
function test($num1,$num2) {
    $result = $num1 + $num2;
    return $result;
}
$n1 = 1;
$n2 = 2;
$result = test($n1,$n2);
echo '足し算の結果は'.$result.'です';
?>
```

こんな感じですかね。ちなみに戻り値の値を受け取る7行目にある$resultという変数は、関数側が`return $result;`だからと言って、$resultという変数名にしているわけではなく、なんでもいいんです。
あと当たり前ですがtest関数の実引数に変数を入れることも文字列を入れることもできます。
ちなみに関数側にある`($num1,$num2)`は仮引数と言います。
この仮引数に値が渡されなかった場合のデフォルト値も設定することができます。

```php:index.php
<?php
function test($num1,$num2 = 2) {
    $result = $num1 + $num2;
    return $result;
}
$n1 = 8;
$result = test($n1);
echo '足し算の結果は'.$result.'です';
?>
```

実行結果は10になります。簡単ですね。
では前回紹介したhtmlspecialcharsという関数を使うのはいちいちめんどくさいのでさらに簡単な関数にしてみましょう。

$postと言う名前の仮引数には`$_POST`や`$_GET`,`$_REQUEST`を使うことを想定しています。

```php:index.php
function test($post) {
    foreach($post as $key => $value) {
        $patch[$key] = htmlspecialchars($value,ENT_QUOTES);
    }
    return $patch;
}
```

一見何をしたかわからない人が大半だと思います。
なので一から説明したいと思います。
この関数には連想配列というものが絡んできて少し難しいです。

###連想配列とは？そもそも配列とは###
配列とは簡単に言えば同じ変数名のなかにいくつもの値を入れられることができるものです。
例えば、$teamという変数の中に、たけし　けんじ　という値を入れたい場合こうなります。

```php:index.php
<?php
$team[] = "たけし";
$team[] = "けんじ";
//または
$team = ['たけし','けんじ'];
?>
```

こんな感じです。配列に値を入れたら値を取り出さなければ意味がないので、取り出すコードはこんな感じになってます。

```php:index.php
<?php
$team = ['たけし','けんじ'];
echo $team[0];
echo $team[1];
?>
```

こんな感じで簡単に取り出すことができます。
ですがこれが膨大なデータとなったらどうでしょう。
いちいちecho team[0];...........
なんて書いてられません。
そのためにあるのが**foreach**です。
for,whileの他にも繰り返しをするものがあったんですよ実は！！！！！！

早速書いてみましょう。

```php:index.php
<?php
$team = ['たけし','けんじ'];
foreach($team as $value) {
    echo $value;
}
?>
```

出力結果は　たけし　けんじ　です。
このようにforeachは配列の要素分繰り返す処理と覚えていただければと思います。
foreach(配列名 as 値）
って感じであとは出力するだけですね。
値は好きなもじに置き換えられますが基本はみんな`$value`とか`$v`とかなんか意味があるものにしています。
じゃあ上のコードの `foreach($post as $key => $value)` はなんだと思う方がいると思います。これには**連想配列**というものが絡んできます。
通常の配列だと値を取り出すのに番号で値を取り出していましたが、
これを連想配列は文字で取り出します。つまり文字が番号のかわりみたいな感じです。
じゃあ連想配列の例をコードに書いてみます。

```php:index.php
<?php
$name = [
    'tanaka' => '田中',
    'sato' => '佐藤',
    'suzuki' => '鈴木'
//tanaka sato suzukiの列がキー (通常の配列で言う番号)
//田中　佐藤　鈴木の列が値
];
//値の取り出し
foreach($name as $key => $value) {
    echo $key.'->'.$value;
}
?>
```
出力結果はtanaka->田中　sato->佐藤 suzuki->鈴木　となります。
foreachを使わないならお察しの通りこのようになります。
`echo $name['tanaka'];`
これでkeyがtanakaの値は田中　ですね。
正直キーなんて出力しなくていい！！って人は
`foreach($name as $value)`
と通常の配列のように値を取り出すことができます。

これらのことを踏まえた上でもう一回さっきの関数をみてみましょう。

```php:index.php
function test($post) {
    foreach($post as $key => $value) {
        $patch[$key] = htmlspecialchars($value,ENT_QUOTES);
    }
    return $patch;
}
```

もうわかりましたね。`$patch[$key]`と言うのは実は連想配列で、
`$_POST`や`$_GET`,`$_REQUEST`も連想配列だったんです！！
`$patch`と言う連想配列を新しく作り、そこに無害化した`$value`を代入していたんですね！！
`$patch`は`$_POST`を無害化したコピーです。
イメージとしてはこんな感じ

```php:index.php
<?php
$patch = [
    $key = $value,
    .       .    ,
    .       .    ,
    .       .    
];
?>
```
こんな感じです。
あとは$patchという連想配列を戻り値として返していくだけですね。
なので実践的に使うとこんな感じかと。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
</head>
<body>
<form action="index.php" method="post">
    名前:
    <input type="text" name="name">
    <input type="submit" value="送信">
</form>
</body>
</html>

```

```php:index.php
<?php
function test($post) {
    foreach($post as $key => $value) {
        $patch[$key] = htmlspecialchars($value,ENT_QUOTES);
    }
    return $patch;
}//無害化関数
?>
<?php 
$patch = test($_POST);//関数testに引数を入れる。
?>
<?php echo '名前は'; ?>
<?php print($patch['name']);//あとは$_POST['name']みたいに使うだけ ?>

```

こんな感じですかね。
必要に応じてtest関数の引数を`$_GET`や`$_REQUEST`に変えてください。
これでいろいろPOSTやGETで値を受け取って無害化するのに手間が省けますね。

#まとめ#
関数やら連想配列やらで難しいと感じた人も多いと思います。
ですが慣れれば簡単です。
そのためにはただみてるだけじゃなくて実践してコード書くことが重要だと思ってます。
またわからないところがあったらすぐ人に聞くのではなく、自分で調べた方が頭に入ります。

次回はオブジェクト指向か、SQLの基本、データベースの基本、ログインシステムの作り方
などをやっていけたらなと思っています。

今回も見てくれてありがとうございました。是非よかったらTwitterのフォローとリポジトリ登録もしてくれると嬉しいです。