按第一列时间戳对csv文件进行排序

时间:2017-12-10 10:58:53

标签: php arrays csv sorting timestamp

我有一个像这样的csv文件

a,b,c
d,e,f
Thdj,jj,jjj,gg

假设a,d和Thdj是时间戳,我如何按降序排序这些行(从最近的时间戳到未来的更远),删除过去的时间戳?

我必须打印这样的输出 表

10/12/2017 |吧| FOO

22/12/2017 |垃圾邮件|蛋

我被困在那里

<?php
$i=array();
$e=array_map('str_getcsv', file('0.csv'));
foreach ($e as $o){
array_push($i,$o[0]);
}
echo var_dump($i);
?>

我得到的结果是

array(3){[0] =&gt; string(1)“a”[1] =&gt; string(1)“d”[2] =&gt; string(4)“Thdj”}

1 个答案:

答案 0 :(得分:0)

试试这个(在php 5.6中测试):

<?php

// timestamps before this date will be ignored
$filter_date = new DateTime();

// stores all rows with timestamp after filter_date
$rows = [];

// read csv
$file = fopen('test.csv', 'rb');
while ($row = fgetcsv($file)) {
    $row_date = DateTime::createFromFormat('d/m/Y', $row[0]);
    if ($row_date >= $filter_date) {
        // add date to row for ordering function
        array_unshift($row, $row_date);
        // store row
        $rows[] = $row;
    }
}
fclose($file);

// sort rows by datetime objects
usort($rows, function ($a, $b) {
    if ($a[0] < $b[0]) {
        return -1;
    }
    if ($a[0] > $b[0]) {
        return 1;
    }
    return 0;
});

// output rows
foreach ($rows as $row) {
    // remove datetime object from each row before printing
    array_shift($row);
    echo implode(' | ', $row) . "\n";
}

使用此csv文件:

08/12/2017,bar,foo
22/12/2017,spam,eggs
10/12/2017,bar,foo

给出这个输出:

10/12/2017 | bar | foo
22/12/2017 | spam | eggs

如果您的CSV文件包含unix时间戳而不是d / m / Y,则可以将DateTime::createFromFormat行更改为DateTime::createFromFormat('U', $row[0])以读取时间戳,然后使用datetime对象&# 39; s format方法以您喜欢的任何格式输出时间戳。