我一直在研究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");
我需要使用类型转换吗?谢谢!
答案 0 :(得分:0)
这可以解决问题:
您必须像这样修改函数:
#define
新的订购将是:
function compare($a, $b)
{
// here, comparing "total" column of each row:
return $a[1] >= $b[1] ? 1 : -1;
}
答案 1 :(得分:0)
比较功能存在三个问题。
将在比较功能中进行比较的项目将是与CSV文件中的行相对应的数组。例如,$a
和$b
就是[1990,57.58]
和[1950,53.22]
之类的东西。
当您在比较函数中引用这些项目时,您正在查看索引[0][1]
,但该索引不存在;数组没有第二维。 $a[0][1]
和$b[0][1]
都将为null,因此不会发生排序。 (您可能会认为尝试使用数组索引引用int或float会收到某种警告或通知,但您不会,只是有关PHP的怪异之一。)
您想按升序排序,但是将$b
放在首位将按降序排序。
根据比较结果,比较函数应返回大于,小于或等于零的int,但您的结果将返回浮点数。有多种方法可以使其返回整数。另一个答案显示了如何使用三元表达式。如果您使用的是PHP 7,则可以使用组合的比较运算符,如下所示:
function compare($a, $b) {
return $a[1] <=> $b[1];
}
此外,您无需定义命名的比较函数,可以根据需要为第二个参数使用匿名函数。
usort($csv, function($a, $b) {
return $a[1] <=> $b[1];
});