ファイルからテキストを取得する | file_get_contents


	$fp = "test1.json";

	// ファイルからテキストを取得する
	$text = file_get_contents($fp);
	
	// BOMを除去する
	$text = deleteBom($text);
	
	// UTF8に変換する
	$text = mb_convert_encoding($text, 'utf-8', 'utf-8,sjis,euc_jp,jis');

	/**
	 * UTF8ファイルのテキストに付いているBOMを除去する
	 * @param string $str UTF8ファイルから取得したテキストの文字列
	 * @return string BOMを除去した文字列
	 */
	function deleteBom($str){
		if (($str == NULL) || (mb_strlen($str) == 0)) {
			return $str;
		}
		if (ord($str{0}) == 0xef && ord($str{1}) == 0xbb && ord($str{2}) == 0xbf) {
			$str = substr($str, 3);
		}
		return $str;
	}
	

XMLテキストを読み込んでデータ配列を取得 | SimpleXMLElement


	class Class1{
		/**
		 * XMLテキストからデータ配列に変換する
		 * 
		 * @note
		 * 多層構造であるとき、階層化の配列が0件でであるなら0件配列でなく空文字がセットされる。
		 * JSONとは完全な互換性はないので注意すること。
		 * 
		 * @param string $xml_text XMLテキスト
		 * @return データ配列
		 */
		public function xml2arr($xml_text){
			// XML解析
			$data= new SimpleXMLElement($xml_text,
					LIBXML_COMPACT | LIBXML_NOERROR,
					false);
			
			// SimpleXMLElementオブジェクト型から配列データに変換する
			$this->obj2arr($data);
			
			return $data;
		}
		
		/**
		 * SimpleXMLElementのレスポンスのオブジェクトをデータ配列に変換する。
		 * 
		 * @note
		 * 階層化の配列が0件である場合、0件配列でなく、空文字がセットされる。
		 * 高速化のため引数を参照型しており、レスポンスも兼ねている。
		 * 
		 * @param array $data SimpleXMLElementオブジェクト → 配列データ
		 */
		private function obj2arr(&$data){
	
			if(is_array($data)){
				foreach($data as $i => &$chiled){
					$this->obj2arr($chiled);
				}
				unset($chiled);
			}elseif(is_object($data)){
				$count = $data->count();
				if(empty($count)){
					$data = '';
				}else{
					$data = get_object_vars($data);
					foreach($data as $i => &$chiled){
						$this->obj2arr($chiled);
					}
					unset($chiled);
				}
			}
		}
	}
	

PHPの罠:文字列と0を比較するときは注意

文字列と0を比較するときは注意しなければならない。
int型の0と文字列を比較すると真になってしまうからである。


	if(0 == 'test'){
		var_dump('真'); // 真となってしまう。
	}else{
		var_dump('偽');
	}
	
理由
PHPは型が異なる値を比較するとき一方を暗黙的にキャストするが、文字列をキャストすると0になってしまうからである。
そのため数値の0と一致というおかしなことが起こる。


配列内の値存在チェック | in_arrayの高速版

in_arrayは遅いと言われいるので高速版を。
ただ検証していないので、実際に速いかどうかはわからず。


	$ary1 = array('neko','犬','ブタ','KANI');
	$checks = array('犬','KANI');
	
	$checks= array_flip($checks);
	foreach ($ary1 as $str1)
		if (isset($checks[$str1])) {
		echo $str1 . '<br>';
	}
	

出力
	犬
	KANI
	

ファイル名の拡張を小文字化する


	/**
	 * ファイル名の拡張を小文字化する
	 * @param ファイル名	(パスは不可)
	 * @return string 拡張を小文字化したファイル名
	 */
	private function extLower($fn){
		$path_param = pathinfo($fn);
		$extension = mb_strtolower($path_param['extension']);
		$fn= $path_param['filename'] . '.' . $extension;

		return $fn;
		
	}
	

関数に配列を参照渡ししたときの検証


	<?php 
	$data = array('neko'=>'ネコ');
	
	$dataB = funcA($data);
	var_dump($data); // array(1) { ["neko"]=> string(15) "大きなネコ" } 
	var_dump($dataB); // array(1) { ["neko"]=> string(15) "大きなネコ" } 
	
	function funcA(&$data){
	    
	    $data['neko']='大きなネコ';
	    return $data;
	}
	
	?>
	

配列の参照実験


	$data = ['animal'=>['neko'=>'ネコ','tanuki'=>'狸']]; // 実験する配列
	var_dump($data);echo '<br>';
	
	// 実験1:
	$tanuki = &$data['animal']['tanuki']; // 実験配列からプリミティブであるtanukiを参照取得する。
	$tanuki = '讃岐うどん'; // 参照取得した値に変更を加えてみる
	unset($tanuki); // 変数を開放する
	var_dump($data);echo '<br>'; // 実験配列に変更が反映されている!
	// 出力→array(1) { ["animal"]=> array(2) { ["neko"]=> string(6) "ネコ" ["tanuki"]=> string(15) "讃岐うどん" } } 
	
	
	// 実験2:
	$animal = &$data['animal']; // 実験配列から配列であるanimalを参照取得する
	$animal['neko'] = '小さい猫'; // animal配列の要素に変更を加える
	unset($animal); // 変数を開放する
	var_dump($data);echo '<br>'; // 実験配列に変更が反映されている!
	// 出力→array(1) { ["animal"]=> array(2) { ["neko"]=> string(12) "小さい猫" ["tanuki"]=> string(15) "讃岐うどん" } } 
	
	
	// 実験3:
	$animal = &$data['animal']; // 実験配列から配列であるanimalを参照取得する
	$animal = ['buta'=>'きれい好きなブタ']; // animalに別の配列をセットする。
	unset($animal); // 変数を開放する
	var_dump($data);echo '<br>'; // 実験配列に変更が反映されている!
	// 出力→array(1) { ["animal"]=> array(1) { ["buta"]=> string(24) "きれい好きなブタ" } } 
	

特殊比較:ゼロ比較

_compare0関数はある程度の違いを吸収した実用的比較関数。
検証


	/**
	 *	ゼロ比較
	 *
	 * @note
	 * 比較用のカスタマイズ関数。
	 * ただし、空の値の比較は0とそれ以外の空値(null,"",falseなど)で仕様が異なる。
	 * 0とそれ以外の空値(null,"",falseなど)は不一致のみなす。
	 * 0と'0'は一致と判定する。
	 * null,'',falseのそれぞれの組み合わせは一致である。
	 * bool型のtrueは数字の1と同じ扱い。(※通常、2や3でもtrueとするが、この関数では1だけがtrue扱い)
	 * 1.0 , 1 , '1' など型が異なる数値を一致と判定する。
	 *
	 * @param $a_value
	 * @param $b_value
	 * @return bool false:不一致 , true:一致
	 */
	function _compare0($a_value,$b_value){
	    if(empty($a_value) && empty($b_value)){
	        if($a_value === 0 || $a_value === '0'){
	            if($b_value === 0 || $b_value === '0'){
	                return true;
	            }else{
	                return false;
	            }
	            
	        }else{
	            if($b_value === 0 || $b_value === '0'){
	                return false;
	            }else{
	                return true;
	            }
	            
	        }
	        
	    }else{
	        
	        if(gettype($a_value) == 'boolean'){
	            if($a_value){
	                $a_value = 1;
	            }else{
	                $a_value = 0;
	            }
	        }
	        if(gettype($b_value) == 'boolean'){
	            if($b_value){
	                $b_value = 1;
	            }else{
	                $b_value = 0;
	            }
	        }
	        
	        
	        if(is_numeric($a_value) && is_numeric($b_value)){
	            if($a_value == $b_value) return true;
	        }else{
	            if($a_value === $b_value) return true;
	            
	        }
	    }
	    
	    return false;
	    
	}
	

パスやURLのセパレータをそろえる

デモ

ツリー構造データ関連クラス

サンプル

	<?php 
	$data = [
			['id'=>1,'name'=>'ネコ','par_id'=>6],
			['id'=>2,'name'=>'生物','par_id'=>0],
			['id'=>3,'name'=>'動物','par_id'=>2],
			['id'=>4,'name'=>'脊椎動物','par_id'=>3],
			['id'=>5,'name'=>'無脊椎動物','par_id'=>3],
			['id'=>6,'name'=>'哺乳類','par_id'=>4],
			['id'=>7,'name'=>'爬虫類','par_id'=>4],
			['id'=>8,'name'=>'魚類','par_id'=>4],
			['id'=>9,'name'=>'昆虫','par_id'=>4],
			['id'=>10,'name'=>'ムカデ','par_id'=>5],
			['id'=>11,'name'=>'カマキリ','par_id'=>9],
			['id'=>12,'name'=>'UMA','par_id'=>2],
			['id'=>13,'name'=>'カッパ','par_id'=>12],
			['id'=>14,'name'=>'ライオン','par_id'=>6],
			['id'=>15,'name'=>'イグアナ','par_id'=>7],
			['id'=>16,'name'=>'植物','par_id'=>2],
			['id'=>17,'name'=>'ダイコン','par_id'=>16],
			['id'=>18,'name'=>'キャベツ','par_id'=>16],
			['id'=>19,'name'=>'テラピア','par_id'=>8],
			['id'=>20,'name'=>'ガーラ','par_id'=>8],
			['id'=>21,'name'=>'カブトムシ','par_id'=>9],
			['id'=>22,'name'=>'タイワンカブト','par_id'=>21],
			['id'=>23,'name'=>'ヘラクレス','par_id'=>21],
			['id'=>24,'name'=>'ブタ','par_id'=>6],
	];
	
	require_once 'TreeStructureData.php';
	$treeStructureData = new TreeStructureData();
	
	$option = array(
			'res_structure'=>4,
			'sort_field'=>'name',
			'html_tbl_class' => 'tbl2',
			'html_tbl_fields' => array('id','name'),
	);
	// 子ノードリストをセットする
	$data = $treeStructureData->tree($data,$option);
	
	if(is_array($data)){
		debug($data);
	}else{
		echo $data;
		
	}

	


ツリー構造データ関連クラス

出力

2
生物
12
UMA
13
カッパ
3
動物
5
無脊椎動物
10
ムカデ
4
脊椎動物
6
哺乳類
1
ネコ
24
ブタ
14
ライオン
9
昆虫
21
カブトムシ
22
タイワンカブト
23
ヘラクレス
11
カマキリ
7
爬虫類
15
イグアナ
8
魚類
20
ガーラ
19
テラピア
16
植物
18
キャベツ
17
ダイコン

検証