指定ディレクトリ内のファイル詳細情報を取得する

scandirEx関数は、指定したディレクトリ内からファイル一覧を取得する。
ファイル一覧には、ファイル名、ファイル更新日時、拡張子、ディレクトリ判定フラグ、画像フラグなどの詳細情報が含まれている。
日本語のファイルおよびディレクトリにも対応している。

サンプルフォルダ

ソースコード

	$fp = 'C:\Users\k-uehara\Downloads\ebi\日本語テスト';
	$data = scandirEx($fp,"\\");
	var_dump($data);
	
	
	/**
	 * 指定ディレクトリ内のファイル詳細情報を取得する
	 *
	 * @note
	 * PHP 5.6 に対応している。
	 * 日本語ディレクトリ、ファイル名に対応している。
	 * ファイル名、フルパス、拡張子、ファイル更新日時、ディレクトリ判定フラグ、画像判定フラグを取得する。
	 *
	 * @date 2016-8-31
	 * @version 1.0
	 *
	 * @param string $dir ディレクトリのフルパスまたはURL
	 * @param string $sep フルパスまたはURLの区分。スラッシュまたはバックスラッシュを指定する。
	 * @return ファイルデータ
	 */
	 function scandirEx($dir,$sep='/'){
	
	
		// ディレクトリが存在するか判定する(日本語フォルダに対応)
		$dir2=mb_convert_encoding($dir,'SJIS','UTF-8');
		if (!is_dir($dir2)){
			return [];
		}
	
	
		// ディレクトリからファイル一覧を取得する
		$files = scandir($dir2);
	
		// 画像拡張子リスト
		$imgExts = array('png','gif','jpg','jpeg','bpg','tiff','bmp','svg');
	
		// ファイル一覧をループする
		$data = [];
		foreach($files as $proto_fn){
				
			// 「.」,「..」は取得対象外なので無視する。
			if($proto_fn=='.' || $proto_fn=='..'){
				continue;
			}
	
			// 日本語ファイルに対応する
			$fn = mb_convert_encoding($proto_fn, 'UTF-8', 'SJIS');
				
			// ファイル名
			$ent['file_name'] = $fn;
	
			// フルパス
			$fp = $dir.$sep.$fn;
			$ent['fp'] = $fp;
	
			// 拡張子
			$path_param = pathinfo($fn);
			$ext = null;
			if(!empty($path_param['extension'])){
				$ext = $path_param['extension'];
			}
			$ent['ext'] = $ext;
	
			// ディレクトリフラグ   false:ファイル  ,  true:ディレクトリ
			$fp2 = mb_convert_encoding($fp, 'SJIS', 'UTF-8');
			$ent['dir_flg'] = is_dir($fp2);
	
			// 更新日時
			$ent['update_dt'] = date("Y-m-d H:i:s", filemtime($dir2.$sep.$proto_fn));
				
			// 画像フラグ
			$img_flg = false;
			if(!empty($ext)){
				$ext2 = mb_strtolower($ext);
				if (in_array($ext2,$imgExts)){
					$img_flg = true;
				}
			}
			$ent['img_flg'] = $img_flg;
				
				
	
	
			$data[] = $ent;
		}
	
	
	
		return $data;
	
	}
	

出力
	array (size=5)
	  0 => 
	    array (size=6)
	      'file_name' => string 'test1.jpg' (length=9)
	      'fp' => string 'C:\Users\k-uehara\Downloads\ebi\日本語テスト\test1.jpg' (length=60)
	      'ext' => string 'jpg' (length=3)
	      'dir_flg' => boolean false
	      'update_dt' => string '2016-05-16 11:41:55' (length=19)
	      'img_flg' => boolean true
	  1 => 
	    array (size=6)
	      'file_name' => string 'test3.jpg' (length=9)
	      'fp' => string 'C:\Users\k-uehara\Downloads\ebi\日本語テスト\test3.jpg' (length=60)
	      'ext' => string 'jpg' (length=3)
	      'dir_flg' => boolean false
	      'update_dt' => string '2016-05-16 12:19:43' (length=19)
	      'img_flg' => boolean true
	  2 => 
	    array (size=6)
	      'file_name' => string 'たぬき' (length=9)
	      'fp' => string 'C:\Users\k-uehara\Downloads\ebi\日本語テスト\たぬき' (length=60)
	      'ext' => null
	      'dir_flg' => boolean false
	      'update_dt' => string '2016-08-31 12:40:59' (length=19)
	      'img_flg' => boolean false
	  3 => 
	    array (size=6)
	      'file_name' => string '新規 テキスト ドキュメント.txt' (length=42)
	      'fp' => string 'C:\Users\k-uehara\Downloads\ebi\日本語テスト\新規 テキスト ドキュメント.txt' (length=93)
	      'ext' => string 'txt' (length=3)
	      'dir_flg' => boolean false
	      'update_dt' => string '2016-08-31 12:48:10' (length=19)
	      'img_flg' => boolean false
	  4 => 
	    array (size=6)
	      'file_name' => string '日本語.png' (length=13)
	      'fp' => string 'C:\Users\k-uehara\Downloads\ebi\日本語テスト\日本語.png' (length=64)
	      'ext' => string 'png' (length=3)
	      'dir_flg' => boolean false
	      'update_dt' => string '2016-08-31 10:40:26' (length=19)
	      'img_flg' => boolean true
	



CSVファイルダウンロード | テキストファイルダウンロード



$data = [
	['id'=>1, 'field'=>'neko', 'wamei'=>'猫'],
	['id'=>2, 'field'=>'yagi', 'wamei'=>'山羊'],
	['id'=>3, 'field'=>'same', 'wamei'=>'鮫'],
	['id'=>4, 'field'=>'wasi', 'wamei'=>'鷲'],
	['id'=>5, 'field'=>'goki', 'wamei'=>'御器'],
];
$csvDl = new CsvDownloader();
$csvDl->output('demo.csv', $data);
	
/**
 * CSVダウンロード
 * 
 * @version 2.0 Excel2019,2016で文字化けするようになった。対応策をコメントに記載。
 * @date 2014-5-12 | 2019-4-11新規作成
 * @author k-uehara
 *
 */
class CsvDownloader{

	
	/**
	 * データをCSVファイルとしてダウンロードする。(UTF-8)
	 *
	 * @param string $csv_file CSVファイル名
	 * @param array  $data データ		エンティティ配列型
	 * @param bool $bom_flg BOMフラグ  0:BOMなし(デフォ),  1:BOM有
	 */
	public function output($csv_file, $data, $bom_flg=0){
		
		$buf = "";
		
		// BOM付きutf-8のファイルである場合
		if(!empty($bom_flg)){
			$buf = "¥xEF¥xBB¥xBF";
		}
		
		// CSVデータの作成
		if(!empty($data)){
			$i=0;
			foreach($data as $ent){
				foreach($ent as $v){
					$cell[$i][] = $v;
				}
				$buf .= implode(",",$cell[$i])."¥n";
				$i++;
			}
		}
		
		// CSVファイルのヘッダーを書き出す
		header ("Content-disposition: attachment; filename=" . $csv_file);
		header ("Content-type: application/octet-stream; name=" . $csv_file);
		
		print($buf); // CSVデータの書き出し
		
	}

	
	/**
	 * データをCSVファイルとしてダウンロードする。(Shift-jis版) ※非推奨メソッド
	 * 
	 * @note
	 * 旧Excelに対応。Excel2019,2016では文字化けする。
	 * 
	 * ▼Excel2019,2016でCSVを開く場合
	 * メモ帳でCSVを開く → 「名前を付けて保存」 → 保存したCSVをExcelで開くと文字化けが治っている。
	 * ただutf-8のCSVでも同様なことができるので、わざわざ当メソッドを使うまでもない。なので当メソッドは非推奨とする。
	 *
	 * @param string $csv_file CSVファイル名
	 * @param array  $data データ		エンティティ配列型
	 */
	public function outputForExcel($csv_file, $data){

		$buf = "";

		// CSVデータの作成
		if(!empty($data)){
			$i=0;
			foreach($data as $ent){
				foreach($ent as $v){
					$cell[$i][] = $v;
				}
				$buf .= implode(",",$cell[$i]) . "¥r¥n";
				$i++;
			}

		}

		// CSVファイルのヘッダーを書き出す
 		header("Content-Type: application/octet-stream");
 		header("Content-Disposition: attachment; filename={$csv_file}");

 		print(mb_convert_encoding($buf,"SJIS", "UTF-8")); // Shift-JISに変換してからCSVデータの書き出し

	}

}
	

旧式


	$lineList = array('TEST','日本語2');
	$txt_file = "text.xml";
	download($txt_file,$lineList);
	
	/**
	 * 行リストをテキストファイルに書き出し、ダウンロードする
	 * 
	 * @param  $txt_file	テキストファイル名
	 * @param  $lineList	行リスト
	 * @param $utf8_flg UTF-8フラグ
	 */
	function download($txt_file,$lineList,$utf8_flg=false){
		
		$buf="";// バッファ
		
		// Shift-jisでダウンロードする
		if(empty($utf8_flg)){

			foreach($lineList as $line){
				$buf .= mb_convert_encoding($line."¥r¥n", "SJIS-win", "UTF-8");
			}

		}
		else{
			$buf = "¥xEF¥xBB¥xBF"; // utf-8形式のファイルにするため、BOMをセットする。

			foreach($lineList as $line){
				$buf .= $line."¥r¥n";
			}
		}

		header ("Content-disposition: attachment; filename=" . $txt_file);
		header ("Content-type: application/octet-stream; name={$txt_file}; charset=utf-8");
		print($buf);

	}
	


zipの解凍 | ZipArchive

PHP8.2の変更点

PHP8.2からは、php.iniにて「extension=zip」を有効する必要があります。


ZipArchiveクラスでzipの解凍ができる。
ZipArchiveクラスは少なくともPHP 5.6では標準クラスである。
便利なクラスであるが、zip内に日本語ファイル名があると文字化けしてしまう弱点がある。


	$zip = new ZipArchive();
	$res = $zip->open('xxx.zip'); // zipファイルを指定
	if($res === true){

	    $zip->extractTo('tmp');// 出力先パスを指定
	    $zip->close();
	    echo '解凍しました。';

	} else {
	    echo '解凍失敗:' . $res;
	}
	


zipの圧縮 | ZipArchive

ZipArchiveクラスでファイルの圧縮ができる。
ZipArchiveクラスは少なくともPHP 5.6では標準クラスである。
便利なクラスであるが、日本語ファイル名に対応していない。


	$zip = new ZipArchive();
	
	// ZIPファイルをオープン
	$res = $zip->open('xxx2.zip', ZipArchive::CREATE);
	
	// zipファイルのオープンに成功した場合
	if ($res === true) {
	
		// 圧縮するファイルを指定する
		$zip->addFile('tmp/xxx/icon_kabuto.jpg');
		$zip->addFile('tmp/xxx/icon_tilapia.jpg');
	
		// 閉じる
		$zip->close();
		echo '圧縮しました<br>';
	}
	

上記の方法はディレクトリ階層をくずさず、階層を保ったまま圧縮が行われる。
ディレクトリ階層は不要である場合、以下のようにファイル追加を行う。

	$zip->addFile('tmp/xxx/icon_kabuto.jpg','icon_kabuto.jpg');
	$zip->addFile('tmp/xxx/icon_tilapia.jpg','icon_tilapia.jpg');
	


サムネイル画像作成:PNG

PHP


	<?php 
	$orig_pfn = "orig/imori.png";
	$thum_pfn = "thum/imori.png";
	
	// オリジナル画像の幅を取得する
	list($orig_width, $orig_height) = getimagesize($orig_pfn);
	
	// オリジナル画像のresourceオブジェクトを取得
	$origImg = imagecreatefrompng($orig_pfn);
	
	// サムネイル画像のresourceオブジェクトを取得
	$thumImg = imagecreatetruecolor(80, 60);
	
	// サムネイル画像を作成
	imagecopyresized($thumImg, $origImg, 0, 0, 0, 0,
			80, 60,
			$orig_width, $orig_height);
	
	// サムネイル画像を出力
	imagepng($thumImg,$thum_pfn);
	
	// resourceオブジェクトを破棄する
	imagedestroy($origImg);
	imagedestroy($thumImg);
	
	echo "<img src='{$thum_pfn}' /><br>";
	
	?>	
	


サムネイル画像作成:JPEG

PHP


	<?php 
	$orig_pfn = "orig/test1.jpg";
	$thum_pfn = "thum/test1.jpg";
	
	// オリジナル画像の幅を取得する
	list($orig_width, $orig_height) = getimagesize($orig_pfn);
	
	// オリジナル画像のresourceオブジェクトを取得
	$origImg = imagecreatefromjpeg($orig_pfn);
	
	// サムネイル画像のresourceオブジェクトを取得
	$thumImg = imagecreatetruecolor(80, 60);
	
	// サムネイル画像を作成
	imagecopyresized($thumImg, $origImg, 0, 0, 0, 0,
			80, 60,
			$orig_width, $orig_height);
	
	
	// サムネイル画像を出力
	imagejpeg($thumImg,$thum_pfn);
	
	// resourceオブジェクトを破棄する
	imagedestroy($origImg);
	imagedestroy($thumImg);
	
	echo "<img src='{$thum_pfn}' /><br>";
	
	?>	
	


サムネイル画像作成:GIF

PHP


	<?php 
	$orig_pfn = "orig/batta.gif";
	$thum_pfn = "thum/batta.gif";
	
	// オリジナル画像の幅を取得する
	list($orig_width, $orig_height) = getimagesize($orig_pfn);
	
	// オリジナル画像のresourceオブジェクトを取得
	$origImg = imagecreatefromgif($orig_pfn);
	
	// サムネイル画像のresourceオブジェクトを取得
	$thumImg = imagecreatetruecolor(80, 60);
	
	// サムネイル画像を作成
	imagecopyresized($thumImg, $origImg, 0, 0, 0, 0,
			80, 60,
			$orig_width, $orig_height);
	
	
	// サムネイル画像を出力
	imagegif($thumImg,$thum_pfn);
	
	// resourceオブジェクトを破棄する
	imagedestroy($origImg);
	imagedestroy($thumImg);
	
	echo "<img src='{$thum_pfn}' /><br>";
	
	?>	
	


サムネイル画像作成:クラス化

PHP


	<?php
	/**
	 * サムネイル作成の拡張クラス
	 * 
	 * @note
	 * 画像ファイルからサムネイル画像を作成する。
	 * 
	 * png,jpeg,gifに対応している。
	 * MIMEタイプではなく、拡張子からファイルを分類している。(MIMEタイプではバグが発生する)
	 * 
	 * @date 2016-11-1
	 * @version 1.0
	 * @author k-uehara
	 *
	 */
	class ThumbnailEx{
		
		
		/**
		 * 画像ファイルからサムネイル画像を作成する
		 * @param string $orig_pfn オリジナル画像のファイル名
		 * @param string $thum_pfn サムネイル画像のファイル名
		 * @param int $thum_width サムネイル画像の横幅
		 * @param int $thum_height サムネイル画像の縦幅
		 */
		public function createThumbnail($orig_pfn,$thum_pfn,$thum_width,$thum_height){
	
			// 拡張子を取得する
			$info = pathinfo($orig_pfn);
			$ext = $info["extension"];
			$ext = mb_strtolower($ext);
	
			// オリジナル画像の幅を取得する
			list($orig_width, $orig_height) = getimagesize($orig_pfn);
			
			
			// オリジナル画像のresourceオブジェクトを取得
			$origImg=null;
			if($ext == 'png'){
				$origImg = imagecreatefrompng($orig_pfn);
			}elseif($ext == 'gif'){
				$origImg = imagecreatefromgif($orig_pfn);
			}else{
				$origImg = imagecreatefromjpeg($orig_pfn);
			}
			
			
		
			// サムネイル画像のresourceオブジェクトを取得
			$thumImg = imagecreatetruecolor($thum_width, $thum_height);
		
			// サムネイル画像を作成
			imagecopyresized($thumImg, $origImg, 0, 0, 0, 0,
					$thum_width, $thum_height,
					$orig_width, $orig_height);
		
		
			// サムネイル画像を出力
			if($ext == 'png'){
				imagepng($thumImg,$thum_pfn);
			}elseif($ext == 'gif'){
				imagegif($thumImg,$thum_pfn);
			}else{
				imagejpeg($thumImg,$thum_pfn);
			}
		
			// resourceオブジェクトを破棄する
			imagedestroy($origImg);
			imagedestroy($thumImg);
			
	
		}
	}	
	


SELECTフォームを作成する


	/**
	 * シンプルなSELECT要素を作成
	 * @param string $name SELECTのname属性
	 * @param primitive $value 初期値
	 * @param array $list 選択肢
	 * @param array $option オプション  要素の属性情報
	 * @param array $empty 未選択状態に表示する選択肢名。nullをセットすると未選択項目は表示しない
	 * 
	 */
	public function select($name,$value,$list,$option=null,$empty=null){
		
		// オプションから各種属性文字を作成する。
		$optionStr = "";
		foreach($option as $attr_name => $v){
			$str = $attr_name.'="'.$v.'" ';
			$optionStr.= $str;
		}
		
		
		$def_op_name = '';
		
		echo "<select name='{$name}' {$optionStr} >¥n";
		
		if($empty!==null){
			$selected = '';
			if($value===null){
				$selected='selected';
			}
			echo "<option {$selected}>{$empty}</option>¥n";
		}
		
		foreach($list as $v=>$n){
			$selected = '';
			if($value===$v){
				$selected='selected';
			}
			echo "<option value='{$v}' {$selected}>{$n}</option>¥n";
			
		}
		
		echo "</select>¥n";
	}
	


型をセットする | settype

settype関数で明示的に型をセットすることができる。
セットする方によっては値が変化することもあるので注意する。

検証コード

	<?php 
	$a = 4;
	output($a);
	settype($a,'string');
	output($a);
	settype($a,'bool');
	output($a);
	settype($a,'int');
	output($a);
	settype($a,'double');
	output($a);
	
	function output($a){
		
		echo $a;
		echo '<br>';
		echo gettype($a);
		echo '<br>';
		echo '-----<br>';
	}
	?>
	

出力
	4
	integer
	-----
	4
	string
	-----
	1
	boolean
	-----
	1
	integer
	-----
	1
	double
	-----
	


型をセットする | 配列へ個別で型指定

配列の各要素に、個別で型指定することができる。

検証コード

	<?php 
	$ary = array(0,1,2,3,4);
	settype($ary[1],'string');
	settype($ary[2],'bool');
	settype($ary[3],'int');
	settype($ary[4],'double');
	output($ary);
	
	function output($ary){
		foreach ($ary as $i=>$v){
			echo $i . '→' . $v . '→'. gettype($v);
			echo '<br>';
			echo '-----<br>';
		}
	}
	?>
	

出力
	0→0→integer
	-----
	1→1→string
	-----
	2→1→boolean
	-----
	3→3→integer
	-----
	4→4→double
	-----