2011-09-12 46 views
1

我有一個按隨機順序給予我的數組。該數組是一個數組數組,我給出了一個命令來根據每個子數組中存在的一個鍵來放置數組。例如,我給出的數組array(array('id' => 1), array('id' => 2))。我被告知根據每個子數組的鍵'id'以(2,1)的順序排列數組。用已知順序對陣列​​進行重新排序的最有效方式

什麼是在PHP中這樣做的最有效的方法?

+0

http://php.net/usort – zerkms

+0

的foreach($順序$ V)$結果[] = array('id'=> $ v);回答問題。 – Alfwed

回答

1

PHP允許你編寫自己的排序函數。我不能保證此解決方案的效率,但它會起作用並直接受到語言的支持,所以我喜歡它。

對於你的情況,你會寫是這樣的:

function custom_sort_by_id($a, $b) { 
    // If the two IDs are the same, no sorting should be done 
    if ($a['id'] == $b['id']) { 
    return 0; 
    } 

    return ($a['id'] < $b['id']) ? -1 : 1; 
} 

你可以這樣調用該函數如下:

usort($myarray, "custom_sort_by_id"); 

因此,例如,如果您有以下起始數組:

array(3) { 
    [0]=> 
    array(2) { 
    ["id"]=>  int(3) 
    ["value"]=>  int(1) 
    } 
    [1]=> 
    array(2) { 
    ["id"]=>  int(2) 
    ["value"]=>  int(2) 
    } 
    [2]=> 
    array(2) { 
    ["id"]=>  int(1) 
    ["value"]=>  int(3) 
    } 
} 

您會收到以下結果:

array(3) { 
    [0]=> 
    array(2) { 
    ["id"]=>  int(1) 
    ["value"]=>  int(3) 
    } 
    [1]=> 
    array(2) { 
    ["id"]=>  int(2) 
    ["value"]=>  int(2) 
    } 
    [2]=> 
    array(2) { 
    ["id"]=>  int(3) 
    ["value"]=>  int(1) 
    } 
} 
0

好吧,最快的方法是創建另一個相同大小的數組,通過隨機數組循環並根據id放置它們。

這是假設ID是爲了(又名1至然而,許多有)

如果不是這樣的話,那麼你就需要遍歷他們陸續找到的最低值,要麼用另一個值交換它或將它移動到另一個臨時數組。

還有其他的事情要考慮,比如列表有多大,如果列表非常大,那麼你可以使用類似快速排序的東西,儘管對於較小的列表來說,像泡泡或插入排序只是工作精細。

http://en.wikipedia.org/wiki/Sorting_algorithm

0

我覺得最CPU效率(雖然沒有過多的內存使用效率)的方法是做2遍:

  1. 作出關聯數組對應的鍵:

    foreach ($array as $item) $ids[$item['id']] = $item; 
    
  2. 結構的結果在給定的順序:

    foreach ($order as $id) $result[] = $ids[$id]; 
    
0

效率很大程度上取決於您將如何處理數據,因此這很難回答。最有效的方法是認識到PHP陣列是actually ordered maps,從一開始構建一個ID密鑰的陣列。還要注意的是,如果你需要將陣列放置在隨機順序定期排序功能將無法正常工作:

<?php 

function add ($needle, &$haystack) 
{ 
    $haystack[$needle['id']] = $needle; 
} 

$map = array(); 
add (array('id' => 1), $map); 
add (array('id' => 10), $map); 
add (array('id' => 100), $map); 
add (array('id' => 1000), $map); 
add (array('id' => 10000), $map); 

$order = array(1,10000,10,1000,100); 

foreach ($order as $o) 
    print_r ($map[$o]); 
相關問題