手入力フラグの自動変換


	/**
	 * 手入力フラグの自動変換
	 *
	 * @note
	 *「なし」などの表現をBool型に自動変換する。
	 *
	 * @param string $flg_str フラグ文字列
	 * @return boolean 
	 */
	function humanInputFlg($flg_str){
		
		$flg_str = mb_convert_kana($flg_str, 'n'); // 全角を半角に変換する
		$flg_str = mb_convert_kana($flg_str, 's'); // 全角スペースを半角に変換する
		$flg_str = mb_convert_kana($flg_str, 'a'); // 全角記号半角に変換する
		$flg_str = trim($flg_str);
		$flg_str = preg_replace('/¥s(?=¥s)/', '', $flg_str); // 連続スペースを一つにする
		
		if(empty($flg_str)) return false;
		
		$fs = ['なし', '無し', '無効', 'false', 'ナシ', 'ナシ', '空', 'none'];
		if(in_array($flg_str, $fs)){
			return false;
		}
		
		return true;
	}
	
検証

ファイル名変更


	$oldname = "test/漢字.txt";
	$newname = "test/aaa.txt";
	rename ($oldname, $newname);
	

日本語ファイル名を半悪英数字に変更


	$dp = 'test';
	$res = jpFnRename($dp);
	
	echo '<pre>';
	var_dump($res);
	echo '</pre>';
	
	
	/**
	 * 日本語ファイル名を半悪英数字に変更 
	 * 
	 * @note
	 * 指定ディレクトリ内の日本語ファイル名を日時から生成したファイル名に一括変更する。
	 * 
	 * @param string $dp ディレクトリパス
	 * @param string $sep セパレータ(省略可)
	 * @return array ファイル名変更情報
	 */
	function jpFnRename($dp, $sep='/'){
		
		$resData = []; // レスポンスデータ
		
		// ディレクトリパスの末尾にセパレータがなければ付け足す。
		$one = mb_substr($dp, -1);
		if($one != $sep) $dp .= $sep;
		
		$fns = scandir($dp);
		foreach($fns as $i => $fn){
			if($fn == '.' || $fn == '..') continue;
			if (!preg_match("/^[a-zA-Z0-9-_.]+$/", $fn)) {
				
				$old_fp = $dp . $fn; // 旧ファイルパス
				
				// 拡張子を取得
				$pi = pathinfo($fn);
				$ext = $pi['extension'];
				
				// 新ファイルパス
				$date_str = date('Ymd_his');
				$new_fp = "{$dp}{$date_str}_{$i}.{$ext}";
				
				rename ($old_fp, $new_fp); // ファイル名変更
				
				$ent = ['old_fp'=>$old_fp, 'new_fp'=>$new_fp,];
				$resData[] = $ent;
				
			}else{
				$old_fp = $dp . $fn;
				$ent = ['old_fp'=>$old_fp, 'new_fp'=>$old_fp,];
				$resData[] = $ent;
			}
		}
		
		return $resData;
	}
	

出力

	array(3) {
	  [0]=>
	  array(2) {
	    ["old_fp"]=>
	    string(16) "test/big_cat.txt"
	    ["new_fp"]=>
	    string(16) "test/big_cat.txt"
	  }
	  [1]=>
	  array(2) {
	    ["old_fp"]=>
	    string(24) "test/あいうえお.csv"
	    ["new_fp"]=>
	    string(26) "test/20190828_080607_3.csv"
	  }
	  [2]=>
	  array(2) {
	    ["old_fp"]=>
	    string(15) "test/赤猫.txt"
	    ["new_fp"]=>
	    string(26) "test/20190828_080607_4.txt"
	  }
	}
	

物理メモリの割り当てを増やす | memory_limit

php.iniの「memory_limit」の値を修正 512MBを割り当てる場合
memory_limit=512M
2GBを割り当てる場合
memory_limit=2G

現在のURLを取得する | HTTP, HOST(ホスト)の部分を取得 | 相対URLの取得

	echo empty($_SERVER["HTTPS"]) ? "http://" : "https://";
	echo $_SERVER["HTTP_HOST"];
	echo $_SERVER["REQUEST_URI"];
	echo (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
	
出力例
	http://
	localhost
	/animal_park/nekos/neko.php
	http://localhost/animal_park/nekos/neko.php?a=1&b=2
	

現在ページの相対URLを取得する


	$url_path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
	
出力例($url_path)→/CrudBase/laravel7/dev/public/neko
URLクエリなどは除去される。


別のファイルを埋め込み(HTMLファイルを埋め込む) | include

include 'other.php';

配列の定数 | const PHP5.6

	const ANIMALS = [
		1 => 'cat',
		2 => 'yagi',
		3 => 'dog',
	];
	
※PHP5.6以上に対応


TCPDFによるPDF | 基本

Demo

PDFを表示 PDFのダウンロード

「TCPDF」はCompserで入手。

TCPDFを導入する前に、php.iniにタイムゾーンが設定されている必要がある。
もしタイムゾーンの設定がされていない場合、php.iniに下記を追記する。
date.timezone = "Asia/Tokyo"
compser.json

{
	"require": {
		"tecnickcom/tcpdf": "*"
	}
}

HTML

<a href="demo1_pdf.php" class="btn btn-success">PDFを表示</a>
<a href="demo1_pdf.php" download class="btn btn-success">PDFのダウンロード</a>

PHP(demo1_pdf.php)

<?php
include '../../../composer/vendor/autoload.php';
$tcpdf = new TCPDF("Portrait");
$tcpdf->AddPage();
$tcpdf->SetFont("kozminproregular", "", 10);
$html = <<< EOF
<style>
	h1 {
		font-weight:bold;
		font-size: 24px;
		color:#FF8080;
	}

</style>
<h1>Hello World!</h1>
いろはにほへと<br>
大きなヤギと小さな犬<br>
EOF;

$tcpdf->writeHTML($html);
$tcpdf->Output("test.pdf");

TCPDFのCSSスタイル

Demo

PDFを表示 PDFのダウンロード

TCPDFは便利であるが、利用できるCSSスタイルは著しく制限されるという弱点がある。HTMLタグにも使用できなものが多数あり。
レイアウトやデザインについてはある程度の妥協が必須である。
改ページに関しては、テキストが増えれば、自動的になされるので便利である。

注意
htmlの属性の記述は「'」ではなく「"」を用いる。
例)
× style='text-align:center'
〇 style="text-align:center"

HTMLタグまたはCSSスタイル効き具合
padding, margin, width, height,
display:inline-block, float:left
こららのレイアウト系CSSスタイルは効かない。table要素で何とか代用しなければならない。td,th要素だけはwidthとheightが効く。
div 幅は100%で固定である。上記にあるようにpadding, margin, width, heightなどは使えない。
border 効く。border-top,border-bottomなどもOK。ただし、線の種類指定はできない。線の太さと色のみ。
table 通常のHTML5とは若干挙動が異なる。罫線も破線などは使えず。
tdタグのcolspan属性は効くのでレイアウトに活用できる。
background-color 効く。
font-size, font-weight, font-style, color, text-decoration 文字装飾系のCSSスタイルはあるていど効いているが、部分的に効かないものもある。下線を破線にしたりはできない。
text-align 中央寄せ、右寄せ、共に問題ない。
ul, ol 効く。しかし上部に隙間が空くので使い勝手は悪い。margin,paddingは使えないので隙間の調整は不可。
strong, small 効く。
hr 黒線のみ。線の色、太さ、種類は一切指定できず。
空白 空白は&npsp;を記述する必要がある。
文字の種類 utf-8で使用できるすべての文字が使えるわけではない。


html

	<a href="/sample/php/a060/tcpdf_demo/demo2_pdf.php" class="btn btn-success">PDFを表示</a>
	<a href="/sample/php/a060/tcpdf_demo/demo2_pdf.php" download class="btn btn-success">PDFのダウンロード</a>
	

demo2_pdf.php

<?php
	include '../../../composer/vendor/autoload.php';
	$tcpdf = new TCPDF("Portrait");
	$tcpdf->AddPage();
	$tcpdf->SetFont("kozminproregular", "", 10);
	
	$param = [];
	$html = render('demo2_in.php', $param);
	
	$tcpdf->writeHTML($html);
	$tcpdf->Output("test.pdf");
	
	function render($in_fn, $params){
		extract($params);
		ob_start();
		
		include $in_fn;
		$html = ob_get_contents();
		ob_end_clean();
		
		return $html;
	}
	

demo2_in.php

<style>
	.box1{
		border:4px solid #90C05C;
		border-radius:4px;
		padding:10px;
	}
.tbl2{
	border-collapse:collapse;
}

.tbl2 th{
	border: 1px solid #bdbfdf;
	color:#393656;
}
.tbl2 td{
	border: 1px solid #bdbfdf;
	color:#34353f;
}
</style>
<h2>TCPDF DEMO2</h2>
Hello World!

<br>
<div style="background-color:red">背景色のテスト</div>
<br>
hrタグのテスト(黒線のみ。線の色、太さ、種類は一切指定できず。)
<hr style="border-top: 3px double red">
&nbsp;<br>
<div style="padding:20px;margin:30px;border-top:4px solid #8080FF">
	border-topのテスト。上罫線のテスト(青色の線)<br>
	padding,marginは一切効かない。<br>
</div>
&nbsp;<br>
画像テスト。imgのwidth属性とheight属性は効果あり。<br>
<img src="test.png" alt="" width="30px" height="50px" /><br>
&nbsp;<br>
テーブルのテスト<br>
<table class="tbl2">
	<thead><tr><th style="width:25%">名前</th><th style="width:25%">生息地</th><th style="width:50%">説明</th></tr></thead>
	<tbody>
		<tr>
			<td style="width:25%">アブラコウモリ</td>
			<td style="width:25%">日本/台湾</td>
			<td style="width:50%">アブラコウモリ(油蝙蝠、学名: Pipistrellus abramus)は、コウモリ亜目ヒナコウモリ科に属するコウモリの一種。日本に棲息する中では唯一の、住家性、すなわち、家屋のみをすみかとするコウモリである。したがって、日本では人間にとって最も身近なコウモリであると言える。その習性から、イエコウモリ(家蝙蝠)の別名がある。史前帰化動物とする説もある。</td></tr>
		<tr style="background-color:#AAAAAA">
			<td>AA</td>
			<td>BB</td>
			<td>CC</td>
		</tr>
	</tbody>
	
</table>

&nbsp;<br>

ブロックレイアウトはtableを活用しなければならない。colspanは何とか効いている。<br>
<table>
	<tr>
		<td>1</td>
		<td>2</td>
		<td>3</td>
		<td>4</td>
		<td>5</td>
		<td>6</td>
	</tr>
	<tr>
		<td colspan="2"><div style="border-bottom:2px solid blue">colspan="2"テストテスト</div></td>
		<td>3</td>
		<td>4</td>
		<td>5</td>
		<td>6</td>
	</tr>
</table>

&nbsp;<br>

<div class="box1" >
	アブラコウモリ(油蝙蝠、学名: Pipistrellus abramus)は、コウモリ亜目ヒナコウモリ科に属するコウモリの一種。日本に棲息する中では唯一の、住家性、すなわち、家屋のみをすみかとするコウモリである。したがって、日本では人間にとって最も身近なコウモリであると言える。その習性から、イエコウモリ(家蝙蝠)の別名がある。史前帰化動物とする説もある。
</div>


&nbsp;<br><br><br><br><br><br><br>
<h3>長文と改ページのテスト</h3>
市街地を中心として、平野部に広く分布する。東京都心をはじめとする都市部の市街地にも数多く棲息し、夕刻の空に普通に見られる。人家のない山間部などには棲息せず、自然洞窟などでの記録は、まれにしかない。1.5cm ほどの隙間があれば出入りすることができ、家屋の瓦の下、羽目板と壁の間、戸袋の中、天井裏、換気口など建物の隙間などを主な棲息場所(ねぐら)とする。都市部では、高層ビルの非常口裏などのほか、道路・鉄道等の高架や橋の下、大型倉庫内などもねぐらとなる。

数頭の家族単位(雌と幼獣)で暮らすことが多いが、幼獣を含む雌の繁殖集団では、50-60頭、時には200頭にもなる。成獣の雄は1頭で暮らすことが比較的多い。

夜行性で、昼間はねぐらで休み、日没近くから夜間に飛び回る。カ、ユスリカ、ヨコバイなどの小型昆虫類を主食とし、ウンカ、甲虫なども捕食する。活動は日没後2時間程度が最も活発。河川などの水面上や田畑・駐車場などのオープンスペース、あるいは街灯の近くなどを、ヒラヒラと不規則に飛び回り、飛翔昆虫を捕食する。都市部では、有機物量の多い汚濁河川から大量に発生するユスリカが重要な食物となっていることが多い。

日本では、11月の中ごろから冬眠に入る。暖かい場所に多数が集まって冬越しをする。3月中下旬に冬眠から覚め、活動を開始する。冬眠期間中でも、暖かい日には飛翔する姿が見られることもある。近年、都市部では冬眠しないものも現れている。

雌は満1歳から出産し、7月初旬に1-4頭(通常は2-3頭)の仔を産む。30日程度で離乳して巣立つ。10月に入ると交尾を行う。精子は雌の生殖器官に貯えられたまま冬を越す。冬眠あけの4月下旬になってから排卵が起こり、受精・妊娠する。寿命は雄で3年、雌で5年ほどと、他のコウモリと比べると短い。雄は1年以内に死んでしまうことが多い。




&nbsp;<br>

<div style="display:inline-block;border:2px solid blue;" >
	インラインブロックは効かない
</div>

&nbsp;<br>
<div style="width:100px;height:40px;border:2px solid blue;" >
	widthとheightは効かない
</div>

&nbsp;<br>
<div style="text-align:center;border:1px solid blue;" >
	text-align:centerによる中央寄
</div>
<div style="text-align:right;border:1px solid blue;" >
	右寄
</div>

&nbsp;<br>
<div style="font-size:2em;color:#A36F3F;border:2px solid blue;" >
	文字に色を付ける。文字を大きくする。
</div>

&nbsp;<br>
<div style="font-weight:bold;border:1px solid blue;" >
	文字を太くする。
</div>
&nbsp;<br>
<span style="text-decoration: underline dotted red;" >
	文字の下に線を引いてみる。一種類の線しか引けず、線色も効かない。
</span>

&nbsp;<br>
<div style=";border:1px solid blue;" >
	<strong>strongタグ</strong>と<small>smallタグ</small>
</div>

&nbsp;<br>
<ul>
	<li>アメリカザリガニ</li>
	<li>ブラックバス</li>
	<li>カミツキガメ</li>
	<li>ガーパイク</li>
</ul>
<br>
	

TCPDF ERROR: Some data has already ...

下記のエラーが表示された場合、「ob_end_clean();」を呼び出すと解決する。
TCPDF ERROR: Some data has already been output, can't send PDF file

WordPressプラグイン開発でPDFを作成するときによく発生する問題。 DBアクセスのため、wp-load.phpを読み込むと上記のエラーが発生することがある。 wp-load.phpのインクルード直下に、「ob_end_clean()」を呼び出せば解決する。

	ob_start();
	include '../../../wp-load.php';
	ob_end_clean();
	global $wpdb;