2016-02-08 194 views
1

PHP是否有能力按照由另一個數組(B)定義的順序對項目數組(A)進行排序?例如。在首先出現在B中的項目決定哪些項目應該先整理A.當按其他數組定義的順序對數組排序

$order_to_sort_by = array("Gold", "Silver", "Bronze"); 
$items_to_sort = array("Bronze", "Silver", "Bronze", "Gold", "Bronze", "Silver"); 

some_sort_function($items_to_sort, $order_to_sort_by); 

結果:

Gold 
Silver 
Silver 
Bronze 
Bronze 
Bronze 

編輯:有人建議重複似乎用另一個數組的鍵來確定應使用數組中的哪些鍵進行排序。有點不清楚,但我不認爲它是重複的。

+1

http://php.net/manual/en/function.usort.php – WheatBeak

+0

的可能的複製(http://stackoverflow.com/ [排序由基於另一陣列密鑰數組?]問題/ 348410 /基於數組的按鍵排序) – CodeGodie

+0

我看過那篇文章,但並不完全明白他在做什麼。這似乎有點不同。我想過將A中的值轉換爲B中相應項的鍵(索引)值,然後進行排序,然後再回傳。我永遠不會有超過幾百個項目,所以性能不是關鍵問題。 – forthrin

回答

2

你可以嘗試這樣的事情

$order_to_sort_by = array("Gold", "Silver", "Bronze"); 
$items_to_sort = array("Bronze", "Silver", "Bronze", "Gold", "Bronze", "Silver"); 

$order_to_sort_by_reversed = array_flip($order_to_sort_by); 
$sortByArray = function($a, $b) use ($order_to_sort_by_reversed) 
{ 
    return $order_to_sort_by_reversed[$a] - $order_to_sort_by_reversed[$b]; 
}; 
usort($items_to_sort, $sortByArray); 

var_dump($items_to_sort); 
+0

這太棒了!迄今爲止最好的一個。簡短而簡單。將密切關注更好的解決方案。 – forthrin

+0

它最終適合您的需求嗎? – Mat

+0

現在我很滿意這個解決方案! – forthrin

1

可以使用usort功能來定義如何比較數組的元素。例如:

$order_to_sort_by = array("Gold", "Silver", "Bronze"); 
$items_to_sort = array("Bronze", "Silver", "Bronze", "Gold", "Bronze", "Silver"); 

usort(
    // What to sort. Input array will be changed! 
    $items_to_sort, 

    // Lets define comparing function inplace 
    // ...just cause we can use anonymous functions: 
    function($a, $b) use ($order_to_sort_by) { 
     // Find position of two comparing elements 
     // ...in our ranking array to find what element 
     // ...is 'greater' than another 
     $a_pos = array_search($a, $order_to_sort_by); 
     $b_pos = array_search($b, $order_to_sort_by); 

     // 0 means that items will not be swapped 
     // 1 for moving $b up 
     // -1 for moving $b down 
     if ($a_pos == $b_pos) { 
      return 0; 
     } else if ($a_pos > $b_pos) { 
      return 1; 
     } else { 
      return -1; 
     } 

     // I hope in php7 it would be able 
     // to use `spaceship` operator in this case 
     // instead of these if`s: 
     //  return $a <=> $b 
    } 
); 

var_dump($items_to_sort); 
+0

這個也有道理,但比'$ order_to_sort_by_reversed'建議稍微麻煩一些。 – forthrin