PHP

ユーザー定義関数
渡された値を指示通りに処理し、結果を吐き出す
処理の材料となる値を引数（パラメータ）、結果を戻り地（返り値）という。


      function seiza($a, $b){
        if((($a == 3) && (21 <= $b && $b <= 31)) ||
              (($a == 4) && (1 <= $b && $b <= 20 ))){
            return "牡牛座";

function → 関数の書き始めを宣言
seiza → 関数名。自分でつける。
($a, $b) → 引数とする変数。
{ } → 実行される処理


      $m = isset($_POST['month']) ? $_POST['month']:'';
      $d = isset($_POST['day']) ? $_POST['day']:'';


      if($m && $d){
       $s = seiza($m, $d);
       print "$m 月 $d 日生まれは $s です。";

function seiza($a, $b) では$a,$bという変数があるが、
その後の $s = seiza($m, $d) では、$m
引数 → 関数に受け渡す値。

実引数 → 関数を呼び出す際に渡す引数。
仮引数 → 関数を定義する際に受け取る引数。

$a,$b は仮引数なので、関数を定義する間の $a,$b として統一していれば良い。
その後、実行する際に、$m,$d で実引数を入れる。
すべて変数になっているが、$a,$b に例えば、1とか2とか入れるパターンで考えるとわかりやすい。

例
【php】実は簡単！関数(function)の使い方、作り方の基本 | WEBクリエイターの部屋 (arts-factory.net)

    <?php
     
    function goaisatsu($namae,$namae2) {
        $message = $namae.'君、'. $namae2.'さん、こんにちは！';
     
        return $message;
    }
     
    echo goaisatsu('太郎','花子');
    ?>



■POST

      $m = $_POST['money'];
      $r = $m -120;
      $kouka = array(500,100,50,10,0);

$_POST[‘money’] でフォームで入力したお金の金額を引っ張ってきて、
おつりの計算をしたいので、$mから120引いた数値を計算

■array
配列の関数。

$a = array(1, 2, 3);
$a = [1, 2, 3]; でも同じ

$a → 配列名
(1, 2, 3) → 要素。入れるべき数値や文字列を入れる。

$a = array(0 => 1 => 1 => 2 , 2 => 3);
ダブルアロー演算子の左側が添え字、右側が値。

print $a[0];
添字を指定することで、特定の値だけ出力できたりする。

■while文
条件が成り立っている間だけ処理を繰り返す制御文。
for文と異なるのは、カウンタにあたるものがないこと。
繰り返す回数がわからないときに使う。

      $r = $m -120;


      $kouka = array(500,100,50,10,0);


        $n = 0;
        while($kouka[$n] > 0){
          print $kouka[$n] . "円玉".(int)($r / $kouka[$n]) . "枚<br>";
          $r = $r % $kouka[$n];

$r は入れたお金。
$nは0が代入されている

        while($kouka[$n] > 0){

$kouka[$n] は添字０が代入されているため、500が指定される
0より大きいため、while文の処理が行われる。

    print $kouka[$n] . "円玉".(int)($r / $kouka[$n]) . "枚<br>";

おつり($r)を硬貨の金額($n)で割ってなおかつ整数を指定する。

(int)で型を指定、変換する意味
PHP - PHP 代入値に (int) を書く意味って何？｜teratail

■演算子

ダブルアロー演算子

    =>

配列、連想配列に値を代入するための演算子

アロー演算子

    ->

インスタンスの持つ、プロパティにアクセスするための演算子。
よくわからないため、後々。

三項演算子 → ?:


    $x = 1;
    $a = ($x < 15) ? 10 : 20;

($x < 15) → 条件式
? 10 → 条件式がtrueの場合
:20 → 条件式がfalseの場合
この場合、xに1が代入されているため、trueとなり、$aには10 が代入される

■変数
$a = 1;
$a の部分が変数。数字や文字列を代入する

■/n

改行文字
/n

改行コード
<br>

/nはソースコード上での改行、<br>はブラウザ表示上での改行

■Isset()
変数に値がセットされているかを調べられる。


    $page = isset($_GET[‘p’]) ? $_GET[‘p’] : 1;

$_GET[‘p’] に値があれば、$page に $_GET[‘p’] をセット
なければ1をセットする


※PHPでは、変数を使う際、値がセットされていない状態で参照しようとすると存在しない
    変数の参照とみなされ、エラーとなる。




      function seiza($a, $b){
        if((($a == 3) && (21 <= $b && $b <= 31)) ||
              (($a == 4) && (1 <= $b && $b <= 20 ))){
            return "牡牛座";
        }elseif((($a == 4) && (21 <= $b && $b <= 30)) ||
                (($a == 5) && (1 <= $b && $b <= 21 ))){
                  return "牡牛座";

ここのfunction seiza ($a, $b) は定義しているだけで実行されない
ユーザ指定関数のseizaの$a,$bは、仮引数。

で合致した場合、returnで特定の星座を返すように


      $m = isset($_POST['month']) ? $_POST['month']:'';
      $d = isset($_POST['day']) ? $_POST['day']:'';

単純に$m,$d にinformで取得した値を代入している。
最後が ’ ’になっているのもなければ、他の数字を入れてもおかしくなるのでそのままにしている


      if($m && $d){
       $s = seiza($m, $d);
       print "$m 月 $d 日生まれは $s です。";
       }

ここの seiza で実行される。

&& → かつ

●preg_match


    preg_match(/正規表現パターン/ , "検索対象の文字列")

検索対象の文字列が正規表現パターンに一致すれば１，一致しなければ０を返す。

PHPのpreg_matchで正規表現によるマッチング方法 | TechAcademyマガジン

正規表現チェッカー PHP: preg_match() / JavaScript: match() (okumocchi.jp)
【5分でまるっと理解】PHP正規表現の使い方まとめ (eng-entrance.com)

https://qiita.com/str32/items/a692073af32757618042




    // 半角英数字とアンダースコアのみ使用可
    // 最初の文字は半角英数アルファベット
    // 3文字以上8文字以内
    
        $password = $_POST['pass'];
        if(preg_match("/^[a-z][a-z0-9_]{2,7}$/i", $password)){
            print "パスワードは正しい形式です。<br>\n";
        }else{
          print "パスワードは正しい形式ではありません。<br>\n";
        }

// → 正規表現を囲う。
^ → 先頭から見る。1文字とかではない
$ → 文末から見る。
[ _ ] → 文字クラス
[ a-z ] → 括弧の中の一文字でも一致するか見る
^[a-z] → 先頭がローマ字小文字
[a-z0-9_]  → 全体が小文字ローマ字、数字、アンダーバーのいづれか
{n,m} → 直前の文字をn回以上m回以上以下の繰り返し。
[a-z0-9_]{2,7}$  → $password を末尾から見ていって、a-z0-9_ のみのいづれかの文字であるか
                                の確認を2～7回繰り返し一致。
i → 大文字小文字を無視する

●preg_split
文字列を分割して配列に格納する

list
→１つ以上の変数に、配列のインデックスを割り当てる。
    array関数などで定義された値と同じ数の変数にそれぞれのインデックスを引き渡す。


    list($orange,$apple,$grape) = array("りんご", "みかん", "ぶどう");
      print ("$orange $apple $grape");

りんご みかん ぶどう と出力される。



        $password = $_POST['pass'];
        if(preg_match("/^[a-z][a-z0-9_]{2,7}$/i", $password)){
            print "パスワードは正しい形式です。<br>\n";
        }else{
          print "パスワードは正しい形式ではありません。<br>\n";
        }



        $olddate = "2017/ 3/ 1 ";
        if(preg_match("/^[ 0-9]+\/[ 0-9]+\/[ 0-9]+$/", $olddate)){
          list($year, $month, $day) = preg_split("/\//", $olddate);
          //4桁-2桁-2桁のフォーマットで表示する
          $newdate = sprintf("%04d-%02d-%02d" , $year, $month, $day);
          print $newdate;
        }else{
          print "日付はありませんでした。<br>\n";
        }

^[ 0-9]+
→ キャレットとプラスがあるので、スペース、0-9の1文字以上で始まる。
    おそらくスペース始まりだった場合を想定してスペースのマッチと＋がついてると思われる。
     
\→ メタ文字を文字として扱う

 ^[ 0-9]+\/[ 0-9]+\/[ 0-9]+$/
→文字化されたスラッシュがあり、括弧に囲われていない部分は一文字として見るわけではないので、
   以下の意味となる。

    一文字以上の[ 0-9]マッチ + / + 一文字以上の[ 0-9]マッチ + / + 一文字以上の[ 0-9]マッチ

    
職業訓練日記 -PHPにおける正規表現- | yukimasablog





    preg_match("/[ 0-9]+\/[ 0-9]+\/[ 0-9]+$/",$olddate)

preg_splitでは、スペースまたは/で区切られた文字列を分割する。
正規表現の中で/を表すときは、￥でエスケープする
[ 0-9] → スペース0-9のいずれかであるか




    list($year, $month, $day) = preg_split("/\//", $olddate);

"/\//", → \にて / をメタ文字として扱う。


preg_split



    $newdate = sprintf("%04d-%02d-%02d" , $year, $month, $day);

sprintf — フォーマットされた文字列を返す

    sprintf(文字列のフォーマット, 入力したい文字１,　入力したい文字２,　・・・)

PHP: sprintf - Manual

d → 引数は整数として扱われ、(符号付き)10進数値として表現されます。
フォーマットを作る！PHPのsprintf関数の使い方【初心者向け】 | TechAcademyマガジン
指定の形式にフォーマット(sprintf) - 文字列関数 - PHP関数 (javadrive.jp)

パディング指定子
→字列が指定の長さに満たない場合にどの文字を使って埋めるのかを指定。

アライメント指定子
→取得できる文字列を左寄せにするか右寄せにするかを指定。デフォルトは左寄せ。

表示幅指定子指定子
→文字列を最低限何桁にするかを指定。

pregの正規表現パターンをクォートで囲む
https://www.webdesignleaves.com/pr/php/php_basic_03.php



変数


配列

array , list






添字
→配列のインデックス番号。キーともいう。

連想配列
→文字列を使った配列。

リテラル
→数値や文字列の値のこと。



演算子


制御文

■if

    if(条件){
        処理
    }

条件に一致する場合は処理を実行


    if(条件){
        処理1
    }else{
        処理2
    }

条件に一致すれば処理1、一致しなければ処理2を実行

関数

■ユーザー定義関数
function

■ビルドイン関数