PHP備忘（Laravel共通部分含む）

自分用備忘も兼ねて。

## 日本語環境
```php
date_default_timezone_set('Asia/Tokyo');
mb_language('Japanese');
```

## 利用メモリの設定変更
```php
ini_set('memory_limit', '1G');
```
## 処理時間の上限を（処理に応じて）引き上げる
```php
set_time_limit(60);
```


## 処理時間を計測する
```php
$time_start = microtime(true);
$keika_time = microtime(true) - $time_start;
echo '経過時間'.round($keika_time,3).'秒<br>'; //小数点以下3桁まで表示
```
## （サーバー上の）指定フォルダ内にあるファイル名を取得
```php
$folder_path = './フォルダ名/';
$files = scandir($folder_path);
foreach ($files as $f) {
    echo $f.'<br>';
}
```

## エスケープ処理用の関数（Xss対策）
```php
function h($a) {
  return htmlspecialchars($a, ENT_QUOTES, 'UTF-8');
}
```
## メールアドレスバリデーション

```php
$email_a = 'tanaka@example.com';
$email_b = 'yamamoto';

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) { //Trueとなる
    echo "'$email_a' はメールアドレスとして有効です。\n";
}
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) { //Falseとなり無効
    echo "'$email_b' はメールアドレスとして有効です。\n";
} else {
    echo "'$email_b' はメールアドレスとして無効です。\n";
}
```

## Null合体演算子 ??　　$_GET $_POSTで使用すると便利
```php
$username = $_GET['user'] ?? '' ; // $_GETがissetされていれば??の左辺がfalseなら右辺が
$username = $_GET['user'] ?? $_POST['user'] ?? '' ;
// $_GET、$_POSTの順にTrueか判定し、それを代入
```

## 並べ替え各種（キーと値の関係を維持するもののみ）
```php
asort ($a);  //値の昇順に並べ替え
arsort($a); //値の降順に並べ替え
ksort ($a);  //キー内容の昇順に並べ替え
krsort($a); //キー内容の降順に並べ替え
```

## 対象文字列を含むかどうか判定
```php
if (strpos('abcdefg','ab') !== false) {
    //対象文字列を含む場合　この場合はこちら
} else {
    //含まない場合
}
```
## PHP8以降　対象文字列を含むかの判定
```php
if str_contains('abcdefg','ab'){
    //対象文字列を含む場合　この場合はこちら
} else {
    //含まない場合
}
```

## 文字の変換
```php
//全角の文字、数字、記号を半角に変換（ex Ａ⇒A）
$a = mb_convert_kana($a, "kna");

//大文字を小文字に変換（ex. A⇒a）
$a = mb_strtolower($a);
```
## switch 条件分岐
```php
switch ($mode){
    case '':
    break;
    case 'a':
    break;
    case 'b':
    break;
}
```
## 過去や未来の日時

```php
echo date('Y/m/d H:i:s',strtotime("-1 second")) //1秒前
echo date('Y/m/d',strtotime("+30 day")) //30日後
//同様に　minute  hour week month year　も使用可
```

## 日付の差　日数の把握
```php
$d1 = new DateTime( 例　'2023/12/11');
$d2 = new DateTime( 例　'2023/12/15');
$dd = date_diff($d1,$d2);//引数は順不同
$sa = $dd -> days;
echo '差は'.$sa.'日';
```

## テキストファイルに追記
```php
$fp   = fopen('ファイル名', 'a');
$line = 'abcdefg\n';
fwrite($fp, $line);
fclose($fp);
```

## クライアントのIPアドレスを取得
```php
$ip = $_SERVER["REMOTE_ADDR"];
```

## リダイレクト

```php
$url = 'sample.php';//リダイレクト先
echo '<meta http-equiv=\'refresh\' content=\'0;URL='.$url.'\'>';
//0の部分はリダイレクトするまでの秒数
```
#### 参考）header関数の利用による遷移⇒こちらは先に何らかの画面表示が行われるとエラーが出る
```php
header("Location: sample.php");
```

## スクレイピング用関数　curlで取得
```php
//スクレイピング用
function homePage ($hp_url){
	$ch = curl_init();
	curl_setopt($ch,CURLOPT_URL,$hp_url);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
	$home_cont = curl_exec($ch);
	curl_close($ch);
	$home_cont = mb_convert_encoding($home_cont,'UTF-8', 'ASCII, JIS, UTF-8, SJIS, euc-jp');
	$home_cont = str_replace(array("\r\n","\n","\r","\t"),"", $home_cont);
	return $home_cont;
}
```

## スクレイピング時等に正規表現での検索を行う　
```php
//preg_match_allで繰り返し検索した上で、最初に一致するものを返す関数
function prgm($pattern,$val){
	preg_match_all($pattern, $val, $matchtitle);
	foreach ($matchtitle[1] as $value) {
		return $value;
	}
    //空だった場合
	return;
}

$pattern = "/<a href=\".*?\">(.*?)<\/a>/";
$val = ホームページ等から取得したhtml等;
$aaa = prgm($pattern,$val);
```
## メール送信
```php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$to      = 送信先メルアド;
$from    = 'From: ---------@---------';
$pfrom   = '-f ---------@---------';
$title   = 'メールタイトル';
$content = 'メール本文（改行は\n）';
if(mb_send_mail($to, $title, $content ,$from ,$pfrom)){
	//エラーが発生しなかった時の処理
} else {
	//送信時にエラーが発生したときの処理
}
```