2013-06-22 37 views
-1

我有一個問題,通過usort()函數處理更長的PHP數組。 我想排序一個數組,如「1.1」,「2.3」,「1.1.2」,「3.1」,30,「3.10」...... 如果我只處理幾個元素,一切正常精細。但是,如果我有40個元素的數組,功能簡直是太慢了 - 這麼慢,它甚至覆蓋了90秒的超時...PHP - usort函數太慢

我的代碼:

function mySort($a,$b) { 
    $a_arr = explode(".",$a); 
    $b_arr = explode(".",$b); 

    if ($a_arr[0] < $b_arr[0]) {return -1;break;} 
    if ($a_arr[0] > $b_arr[0]) {return 1;break;} 

    for($i=0;$a_arr[$i]==$b_arr[$i];$i++){ 
     if ($a_arr[$i+1] < $b_arr[$i+1]) {return -1;break;} 
     if ($a_arr[$i+1] > $b_arr[$i+1]) {return 1;break;} 
    } 
    } 

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10"); //example, I take this data from the database 

usort($sort_array,"mySort"); 

...任何人都可以請幫助?有沒有可能解決這個問題?任何幫助將不勝感激。

在此先感謝。

+1

你到底有什麼'在那裏break'?代碼已經有了'return'ed,並且break永遠不會被執行。 –

+0

什麼是for循環?我不明白......,你能否解釋你的排序算法需要做什麼?分享期望的輸出。 – elclanrs

+1

不會使用version_compare()會更有效地將此細分爲子排列 –

回答

1

當數組中的值相等時,循環不會退出。在某個地方添加一個返回0子句來表示數組中兩個元素相等的時候。

這可能發生在您列出任一列表(a,b)的元素之外時。否則,您將獲得有關訪問不存在的數組索引的通知。 (你的樣品給出一個這樣的通知)

+0

...我這樣一個愚蠢的錯誤。非常感謝。 –

2
function mySort($a,$b) { 
    return version_compare($a,$b); 
} 

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10");  
usort($sort_array,"mySort"); 

var_dump($sort_array); 

甚至乾脆

$sort_array = array("1.1","2.3","1.1.2","3.1","30","3.10");  
usort($sort_array,"version_compare"); 

var_dump($sort_array); 
+0

Yeap。也適用。謝謝! –