我写了这个剧本:
<?PHP
$file_handle = fopen("info.txt", "rb");
while (!feof($file_handle) ) {
$line_of_text = fgets($file_handle);
$parts[] = explode('|', $line_of_text);
}
fclose($file_handle);
$a = $parts;
function cmp($a,$b){
return strtotime($a[8])<strtotime($b[8])?1:-1;
};
uasort($a, 'cmp');
$failas = "dinfo.txt";
$fh = fopen($failas, 'w');
for($i=0; $i<count($a); $i++){
$txt=implode('|', $a[$i]);
fwrite($fh, $txt);
}
fclose($fh);
?>
当我使用时:
print_r($a);
之后
uasort($a, 'cmp');
然后我可以看到排序数组。但是当我使用这些命令写入文件时:
$fh=fopen($failas, 'w');
for($i=0; $i<count($a); $i++){
$txt=implode('|', $a[$i]);
fwrite($fh, $txt);
}
fclose($fh);
它显示未排序的信息,我做错了什么?
答案 0 :(得分:2)
这应该适合你:
这里我首先将您的文件放入一个file()
的数组中,其中每一行都是一个数组元素。在那里,我忽略每行末尾的空行和换行符。
在此之后,我使用usort()
对数组进行排序。我首先通过explode()
获取每行的所有日期和时间。在此之后,我只需使用strtotime()
获取每个日期的时间戳,然后将其与彼此进行比较。
最后,我只需使用file_put_contents()
保存文件,我还会在每行的末尾添加一个换行符array_map()
。
<?php
$lines = file("test.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
usort($lines, function($a, $b){
list($aDate, $aTime) = explode(" ", explode("|", $a)[substr_count($a, "|")]);
list($bDate, $bTime) = explode(" ", explode("|", $b)[substr_count($b, "|")]);
if(strtotime("$aDate $aTime") == strtotime("$bDate $bTime"))
return 0;
return strtotime("$aDate $aTime") < strtotime("$bDate $bTime") ? 1 : -1;
});
file_put_contents("test.txt", array_map(function($v){return $v . PHP_EOL;}, $lines));
?>
旁注:
我建议您将这些数据保存在数据库中,以便对数据进行排序和获取时非常灵活!
修改强>
对于在&lt; 5.3下具有php版本(echo phpversion();
)的人,只需将匿名函数更改为普通函数,并将函数名称作为字符串传递:
<?php
$lines = file("test.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
function timestampCmp($a, $b) {
$aExploded = explode("|", $a);
$bExploded = explode("|", $b);
list($aDate, $aTime) = explode(" ", $aExploded[substr_count($a, "|")]);
list($bDate, $bTime) = explode(" ", $bExploded[substr_count($b, "|")]);
if(strtotime("$aDate $aTime") == strtotime("$bDate $bTime"))
return 0;
return strtotime("$aDate $aTime") < strtotime("$bDate $bTime") ? 1 : -1;
}
function addEndLine($v) {
return $v . PHP_EOL;
}
usort($lines, "timestampCmp");
file_put_contents("test.txt", array_map("addEndLine", $lines));
?>