使用PHP按列对CSV数据进行排序

时间:2018-12-13 23:51:04

标签: php sorting

我一直在研究Stack Overflow,但似乎没有可行的解决方案。知道我是新手!

假设我有一个包含以下内容的文件(data.csv):

year,total
1990,57.58
2011,73.28
1880,54.67
1996,53.41
1950,53.22
1979,52.76
1876,52.62
1883,52.35
1882,52.12
2018,52.23

...然后使用PHP导入数据:

$csv = array_map('str_getcsv', file('data.csv'));

如何将年份和总计按总列按升序排序(例如数组中的1882 / 52.12在$ csv [0]以下,而2011 / 73.28在$ csv [10]以下?

以下内容和打印内容($ csv);似乎没有以正确的顺序获得物品:

function compare($a, $b) {
    return ($b[0][1] - $a[0][1]);
}
usort($csv, "compare");

我需要使用类型转换吗?谢谢!

2 个答案:

答案 0 :(得分:0)

这可以解决问题:

您必须像这样修改函数:

#define

新的订购将是:

function compare($a, $b)
{
    // here, comparing "total" column of each row:
    return $a[1] >= $b[1] ? 1 : -1;
}

答案 1 :(得分:0)

比较功能存在三个问题。

  1. 将在比较功能中进行比较的项目将是与CSV文件中的行相对应的数组。例如,$a$b就是[1990,57.58][1950,53.22]之类的东西。

    当您在比较函数中引用这些项目时,您正在查看索引[0][1],但该索引不存在;数组没有第二维。 $a[0][1]$b[0][1]都将为null,因此不会发生排序。 (您可能会认为尝试使用数组索引引用int或float会收到某种警告或通知,但您不会,只是有关PHP的怪异之一。)

  2. 您想按升序排序,但是将$b放在首位将按降序排序。

  3. 根据比较结果,比较函数应返回大于,小于或等于零的int,但您的结果将返回浮点数。有多种方法可以使其返回整数。另一个答案显示了如何使用三元表达式。如果您使用的是PHP 7,则可以使用组合的比较运算符,如下所示:

    function compare($a, $b) {
        return $a[1] <=> $b[1];
    }
    

此外,您无需定义命名的比较函数,可以根据需要为第二个参数使用匿名函数。

usort($csv, function($a, $b) {
    return $a[1] <=> $b[1];
});