2008-09-04 10 views
3

這是一個php的例子,但任何語言的算法都可以。我特別想要做的是將美國和加拿大吹到榜單的頂端。下面是爲簡潔起見縮短陣列的一個例子。鑑於我有一個按字母順序排序的id(鍵)和國家(值)的哈希值,什麼是最好的方式來泡進一個條目到棧頂?

array(
    0 => '-- SELECT --', 
    1 => 'Afghanistan', 
    2 => 'Albania', 
    3 => 'Algeria', 
    4 => 'American Samoa', 
    5 => 'Andorra',) 

該id需要保持不變。所以使他們-1或-2將不幸工作。

回答

1

我在類似情況下的捷徑是在加拿大開始時增加一個空格,在美國開始時增加兩個空格。如果將這些選項顯示爲SELECT標籤中的選項,則空間不可見,但排序仍將它們置於前面。

但是,在某些情況下,這可能有點冒失。在Java中,要做的事情是擴展StringComparator,重寫比較()方法,製作美國和加拿大的特例,然後對傳入新比較器的列表(或數組)進行排序,作爲排序算法。

但是我想可能會更簡單,只需在數組中找到相關條目,將它們從數組中刪除並在開始時再次添加它們。如果你在某種框架將重新排序數組,那麼它可能無法正常工作。但在大多數情況下,這樣做會很好。

我看到你正在使用散列而不是數組 - 所以它將取決於你如何進行排序。你可以簡單地把美國加入到-2的加密中,加1加1,然後按ID排序?沒有在憤怒中使用過11年的PHP,我不記得它是否有內置的哈希分類,或者你是否在應用程序級別進行分類。

6

我通常在這些情況下做的是添加一個名爲DisplayOrder或類似的獨立字段。一切都默認爲1,然後按DisplayOrder排序,然後按名稱排序。如果您想要列表中的項目更高或更低,則可以相應地調整顯示順序,同時保持正常的ID。

- 凱文仙童

1
$a = array(
    0 => '- select -', 
    1 => 'Afghanistan', 
    2 => 'Albania', 
    3 => 'Algeria', 
    80 => 'USA' 
); 

$temp = array(); 
foreach ($a as $k => $v) { 
    $v == 'USA' 
     ? array_unshift($temp, array($k, $v)) 
     : array_push($temp, array($k, $v)); 
} 
foreach ($temp as $t) { 
    list ($k, $v) = $t; 
    echo "$k => $v\n"; 
} 

輸出然後:

80 => USA 
0 => - select - 
1 => Afghanistan 
2 => Albania 
3 => Algeria 
0

不能通過圍繞「移動」的項目改變同一陣列內的元素的順序。你可以做它來構建第一有你最喜歡的項目,然後一個新的數組的末尾添加任何東西從原來的國陣其他:

$countries = array(
    0 => '-- SELECT --', 
    1 => 'Afghanistan', 
    2 => 'Albania', 
    3 => 'Algeria', 
    4 => 'American Samoa', 
    5 => 'Andorra', 
    22 => 'Canada', 
    44 => 'United States',); 

# tell what should be upfront (by id) 
$favourites = array(0, 44, 22); 

# add favourites at first 
$ordered = array(); 
foreach($favourites as $id) 
{ 
    $ordered[$id] = $countries[$id]; 
} 

# add everything else 
$ordered += array_diff_assoc($countries, $ordered); 

# result 
print_r($ordered); 

Demo

相關問題