2012-06-29 61 views
1

我想了解如何PHP功能usort的作品。 我有這樣的代碼:如何理解usort邏輯?

<?php 
$users[] = array('login' => 'moon', 'name' => 'Chris'); 
$users[] = array('login' => 'star', 'name' => 'Piter'); 
$users[] = array('login' => 'mars', 'name' => 'Tim'); 
$users[] = array('login' => 'earth', 'name' => 'Garry'); 

function compare($a, $b) {     
    echo $a['login'] . '--' . $b['login'] . '<br />'; 
    echo strcmp($a['login'], $b['login']) . '<br />'; 
    return strcmp($a['login'], $b['login']);    
} 
usort($users, "compare"); 

echo '<pre>'; print_r($users); echo '</pre>'; 
?> 

它將輸出這樣的結果:

star--moon 
1 
star--mars 
1 
earth--star 
-1 
moon--earth 
1 
mars--moon 
-1 
earth--mars 
-1 
Array 
(
    [0] => Array 
     (
      [login] => earth 
      [name] => Garry 
     ) 

    [1] => Array 
     (
      [login] => mars 
      [name] => Tim 
     ) 

    [2] => Array 
     (
      [login] => moon 
      [name] => Chris 
     ) 

    [3] => Array 
     (
      [login] => star 
      [name] => Piter 
     ) 

) 

據我明白第二PARAM應該是比較函數,它只能返回3個值(-1,0, 1)和usort使用此結果對數組進行排序?另外我讀到,usort使用Quicksort實現對數組進行排序。這就是爲什麼明星是第一個和月亮 - 秒? Quicksort將數組分成兩部分,然後對其進行排序?我可以實現2,3維數組的這個函數嗎?

回答

2

是的,usort使用比較函數來比較值並將數組與quicksort算法進行排序。從http://php.net/manual/en/function.usort.php

如果第一個參數被認爲是比上述第二分別小於,等於或大於比較函數必須返回一個整數比小於零,等於,或更大。

鏈接到PHP中的usort的實現可以在這裏找到:What sort algorithm does PHP use?。據http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/算法使用中間元素作爲支點元素,因爲這實現:

offset = (end - begin) >> 1; 

這應該是爲什麼該算法採用「明星」作爲第一個主元。

對於多維陣列,如果要維護索引關聯,請使用uasortThis question包含排序多維數組的示例。

+0

很好的回答。但你能解釋一下嗎?在你寫的回答文章中,最好在排序前使用'shuffle'。這個'shuffle'對pivot元素沒有影響嗎?算法的特點是它更好地處理混洗陣列? –

+0

是的,在排序之前對數組進行混洗可能會避免最糟糕的情況,比如數組已經排序,但算法仍然選擇中間元素作爲主元素。但是這個中間元素在洗牌之後可能是一個不同的元素,而不是洗牌前的元素。 –

1

您在告訴usort比較陣列中的任何兩個項目時首先放置哪個項目。您的函數返回元素的login值的strcmp比較,因此它將根據登錄名按字母順序排列所有元素。

+0

它是如何決定在下一次迭代期間應該比較哪些元素的?而且,它也應該比較每一個元素? –

+0

閱讀http://php.net/manual/en/function.usort.php上的評論 - 特別是第一個。它不會將每個元素與每個其他元素進行比較 - 排序算法不需要。 –