//大文件排序 関数countsLines($パス){ $ FD =のfopen($パス、 "R"); $合計= 0; しばらく(!feofを($ FD)){ $合計++; 関数fgets($ FD); } $の合計を返します。 } $ filePathに= "./file.dat"。 関数checkFiles($パス、$行= 5000){ $ totalFiles = countsLines($パス)。 $ totalFiles = CEIL($ totalFiles / $行)。 $ファイル= []; $ FD =のfopen($パス、 "R"); 用($ i = 1; $ I <= $ totalFiles; $ I ++){ $ fileNameに= $ I "DAT"; $ファイル[] = $ファイル名; $ SD =のfopen($ fileNameに、 "W +"); $ J = 1; しばらく(!feofを($ FD)&& $ J <= $行){ fputs($ SD、関数fgets($ FD)); } fcloseを($のSD)。 } FCLOSE($ FD)。 $ファイルを返します。 } 関数cSort($ファイル){ foreachの($ファイル$キー=> $ファイルとして){ $コンテンツ=ファイル($ファイル)。 $コンテンツ= array_mapを(関数($値){ リターントリム($値); }、$コンテンツ)。 ソート($コンテンツ)。 $ FD =のfopen($ファイル、 "W +"); foreachの($キーとして$コンテンツ=> $値){ $値= $ value.PHP_EOL。 fputs($ FD、$値); } } } //合并数组 関数mergeAllData($ファイル){ (1>カウント($ファイル))、一方、{ $ fname1 = array_shift($ファイル)。 $ fname2 = array_shift($ファイル); $ newFileName = str_replace( ""、$ fname1。 "DAT")、 " - "(DAT " ""、$ fname2。)str_replace。"; "DAT"。 $ FD1 =のfopen($ fname1、 "R"); $ FD2 =のfopen($ fname2、 "R"); $ FD3 =のfopen($ newFileName、 "W +"); $ LINE1 = fgetsの($ FD1)。 $ LINE2 = fgetsの($ FD2)。 一方、(TRUE){ $ LINE1 = INTVAL($ LINE1)。 $ LINE2 = INTVAL($ LINE2)。 IF($ LINE1 <$ LINE2){ fputs($ FD3、$ line1.PHP_EOL)。 $ LINE1 = fgetsの($ FD1)。 もし(FEOF($ FD1)==真|| $ LINE1 === ""){ fputs($ FD3、$ line2.PHP_EOL)。 ブレーク; } }他{ fputs($ FD3、$ line2.PHP_EOL)。 もし(FEOF($ FD2)==真|| $ LINE2 === ""){ cSort($ファイル); fputs($ FD3、$ line1.PHP_EOL)。 ブレーク; } } } (FEOF($ FD1)!)一方、{ $ STR =関数fgets($ FD1)。 (!$ strの= ""){もし fputs($ FD3、$ strの); } } ながら(!FEOF($ FD2)){ $ STR =関数fgets($ FD2)。 (!$ strの= ""){もし fputs($ FD3、$ strの); } } FCLOSE($ FD1)。 fcloseを($ FD2)。 fcloseを($ FD3)。 ($ファイル、$ newFileName)をするarray_unshift。 } } //切割 $ファイル= checkFiles($ filePathに); //合并 mergeAllData($ファイル);