在写入文件时,数组不排序

时间:2015-04-25 21:46:11

标签: php file sorting text implode

我写了这个剧本:

<?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);

它显示未排序的信息,我做错了什么?

1 个答案:

答案 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));

?>