实现思路
- 文件拆分
- 子文件排序
- 依次对比每个文件的行
- 按排序要求把最小或最大的行插入新文件
- 从刚满足要求行的文件中,再取出一条数据
- 循环4,5步骤
- 直至所有是数据完成,完毕文件
伪代码
<?php
class ReadFile
{
public string $file_name;
private $fd;
public int $line;
function __construct($file_name)
{
$this->file_name = $file_name;
$this->fd = fopen($this->file_name, "r+");
}
public function getLine(): ?int
{
if(!feof($this->fd)) {
$this->line = fgets($this->fd);
} else {
return null;
}
return intval($this->line);
}
function __destruct() {
fclose($this->fd);
}
}
$file_name = "file_1";
$obj = new ReadFile($file_name);
echo $obj->getLine();
echo $obj->getLine();
echo $obj->getLine();
class SortFile
{
private $fd;
private $instance_arr;
function __construct($total_num) {
$this->fd = fopen("total", "ab+");
for ($i=1; $i<=$total_num; $i++) {
$file_name = "file_{$i}";
$obj = new ReadFile($file_name);
$this->instance_arr[$obj->getLine()] = $obj;
}
}
function sort(): void
{
while(count($this->instance_arr)>0) {
$o = $this->compare();
$this->appendFile($o);
$this->addLineToInstanceArr($o);
}
}
function compare(): ?ReadFile
{
ksort($this->instance_arr);
foreach ($this->instance_arr as $resource) {
return $resource;
}
return null;
}
function appendFile(ReadFile $readFile): void
{
fwrite($this->fd, $readFile->line);
}
function addLineToInstanceArr(ReadFile $readFile): void
{
unset($this->instance_arr[$readFile->line]);
$data = $readFile->getLine();
$data === null ?: $this->instance_arr[$data] = $readFile;
}
}
(new SortFile(2))->sort();