使用usort(PHP)对数组中的2个字段ASC进行排序

时间:2014-06-21 19:55:34

标签: php arrays usort

我有一个包含此内容的文本文件(id; date; user):

8559;2014-06-13;Carlos
8584;2014-06-23;1A Auto
8398;2014-06-02;LRDream
7738;2014-05-19;Felicitia Motors
8475;2014-06-06;Motori
8331;2014-06-30;Otto Burner
8521;2014-06-24;Mirage
3699;2014-06-30;LR DMJ
8050;2014-05-19;1A Auto
7428;2014-05-20;Carlos

目标是输出按1)月和2)用户名排序的数据。

<?

$data = file("data.csv");

foreach ($data as $value)
{
$bla=explode(";",$value);
$new[$bla[0]]['date']=substr($bla[1],0,-3);
$new[$bla[0]]['user']=$bla[2];
}

function comp($a, $b)
{ if ($a['date'] == $b['date']) { return $a['user'] - $b['user']; }
return strcmp($a['date'], $b['date']);
} 
usort($new, 'comp');

foreach ($new as $value)
{
echo $value['date']." - ".$value['user']."<br>";
}

?>

这会正确排序月份,但用户并未真正排序:

2014-05 - Carlos
2014-05 - Felicitia Motors
2014-05 - 1A Auto <---
2014-06 - LR DMJ
2014-06 - Mirage
2014-06 - Motori
2014-06 - LRDream <---
2014-06 - Carlos <---
2014-06 - Otto Burner
2014-06 - 1A Auto <---

代码有什么问题?

谢谢! NBG

1 个答案:

答案 0 :(得分:0)

那是因为您没有比较用户名 - 您在数字上减去它们,这会产生完全不合适的结果(请参阅string conversion to numbers)。

return $a['user'] - $b['user']替换为return strcmp($a['user'], $b['user'])以获得预期结果。

无耻的自我推销:您还可以考虑使用我提供的方便的排序技术here来获得更正常的代码以获得正确的结果:

usort($new, make_comparer('date', 'user'));