2014-06-21 34 views
1

我有此內容的文本文件(ID;日期;用戶):排序與usort(PHP)在陣列2字段ASC

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

回答

0

這是因爲您沒有比較用戶名 - 您正在用數字相減,這給出了完全不恰當的結果(請參閱string conversion to numbers)。

return $a['user'] - $b['user']替換爲return strcmp($a['user'], $b['user'])以獲得預期結果。

無恥的自我推銷:你也可以考慮使用的方便分揀技術,我給here具有更吸引人的代碼來得到正確的結果:

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