1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
/** -------------------------------------------------------------------------------
 *   ファイルシステム:マスターファイルに対する変更データで変更更新処理の利用例
 *  2015.09.19 作成 yoshi of CXMedia Inc.
 * -------------------------------------------------------------------------------- */
// header関数を実行
header("Content-type:text/plain; charset=UTF-8");

// ファイルのパス指定
$trn_file_path 'data/trans_data.csv';  //変更指示データのファイル
$mst_file_path 'data/master_data.txt'//マスターのファイル

// 変更指示データの存在チェック
if( !is_file($trn_file_path)){
    echo 
"ERROR:{$trn_file_path}のファイルがありません";
    exit;
}
// 変更指示ファイルの配列クリア
$trn_data = array();

// 変更指示データファイルの読み込み処理
$fh fopen($trn_file_path,"r");
/* ---------------------------------------------------------------------------
 * 変更指示データの読み込み:csv形式
 * fgetcsv( handle [,length [,delimiter [,enclosure [,escape]]]])
 *   lengthの省略:最大行長制限なし、lengthの省略:","、escapeは、PHP5.3以降
 * --------------------------------------------------------------------------- */
while (($data fgetcsv($fh0",")) !== FALSE) {
    
$trn_data[] = $data;
}
// ファイル閉じる
fclose$fh );

// マスターファイルの配列クリア
$mst_data = array();

// マスターファイルの更新処理
$fh fopen($mst_file_path,"c+");

// --- 排他ロックの開始 ---
@flock($fh,LOCK_EX);

// マスターファイルのtab区切りで読み込み
while (($data fgetcsv($fh0"\t")) !== FALSE) {
    
$mst_data[] = $data;
}
//自動連番の最大値セット
$idx count($mst_data);
$max_seq $mst_data[$idx-1][0];

// 削除:del、変更:upd、追加:insのデータからマスターデータを更新
foreach ($trn_data as $data_ary){
    
$chg array_shift($data_ary);
    
$id  $data_ary[0];
    
    
// 削除、変更データ指示のとき
    
if($chg == 'del' || $chg == 'upd'){
        
// マスターデータから該当するIDヒット検索
        
for($i=0;$i<count($mst_data);$i++){
            if(
$id == $mst_data[$i][0]){
                
// 削除のとき、IDにdelをセット
                
if($chg == 'del'){
                    
$mst_data[$i][0] = 'del';
                }
                
// 変更のとき、更新日とデータ塗り替え
                
else {
                    
// 更新日付のセット
                    
$data_ary[9] = date('Y-m-d H:i:s');
                    
$mst_data[$i] = $data_ary;
                }
                break;
            }
        }
    }
    
// 追加データ指示のとき
    
elseif($chg == 'ins'){
        
$max_seq++;
        
$data_ary[0] = $max_seq;
        
// 更新日付のセット
        
$data_ary[9] = date('Y-m-d H:i:s');
        
$mst_data[] = $data_ary;
    }
}

// ファイルポインタを先頭に戻す
rewind($fh);

// マスターファイルの更新:tab区切りの配列出力
foreach($mst_data as $data_ary){
    
// 削除データを出力しない
    
if($data_ary[0] != 'del'){
        
fputcsv($fh,$data_ary,"\t");
    }
}

// --- ロックの解除 ---
flock($fh,LOCK_UN);

// ファイル閉じる
fclose$fh );

echo 
"■処理完了「連番の最大値」$max_seq\n";
?>