2008-09-04 30 views
3

Bu bir php örneğidir, ancak herhangi bir dil için bir algoritma yapar. Özellikle yapmak istediğim şey Amerika Birleşik Devletleri ve Kanada'yı listenin en üstüne getirmektir. İşte kısaltma için kısaltılmış dizinin bir örneği.Alfabetik olarak sıralanmış bir kimlik (anahtar) ve ülkeler (değerler) karması aldığımı varsayalım, bir girişi yığının üstüne getirmenin en iyi yolu nedir?

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

Kimlik, sağlam kalması gerekir. Yani onları -1 veya -2 yapmak maalesef işe yaramayacak.

cevap

1

Benzer durumlarda kısayolum, Kanada'nın başlangıcında ve Amerika'nın başlangıcında iki alan için bir boşluk eklemektir. Bunları SELECT etiketinde seçenekler olarak görüntülüyorsanız, boşluklar görünmez, ancak sıralama yine de onları ön tarafa getirir. Bununla birlikte, bazı bağlamlarda bu biraz rahatsız olabilir. Java'da yapılacak olan şey, StringComparator'u genişletmek, ABD ve Kanada'daki özel durumları yapmak için compare() yöntemini geçersiz kılmak, sonra da sıralama karşılaştırması olarak yeni karşılaştırıcınızda geçen listeyi (veya diziyi) sıralamak olacaktır.

Bununla birlikte, dizideki ilgili girdileri bulmanın, bunları diziden kaldırmanın ve bunları yeniden başlatarak yeniden eklemenin daha kolay olabileceğini düşünürdüm. Diziyi yeniden sıralayacak bir tür çerçevede iseniz, o zaman işe yaramayabilir. Ama çoğu durumda bu sadece iyi olacak.

[değiştir] Gördüğünüz gibi bir karma değil bir dizi kullanıyorsunuz - bu yüzden sıralama işlemini nasıl yaptığınıza bağlı olacaktır. ABD'yi -2 ile Kanada, -1 ile Kanada'ya getirip, yerine ID ile sıralayabilir misiniz? 11 yıldır öfke içinde PHP kullanmamış olması, onun hash'larda yerleşik sıralama yapıp yapmadığını veya bunu uygulama düzeyinde yapıp yapmadığınızı hatırlamıyorum.

6

Genellikle bu durumlarda yaptığım şey, DisplayOrder adlı başka bir alan veya benzeri bir alan eklemektir. Her şey varsayılan olarak, 1 olsun ... Sonra DisplayOrder ve sonra Ad ile sıralayın. Listede daha yüksek veya daha düşük bir şey istiyorsanız, normal kimliğinizi olduğu gibi tutarken ekran sırasını buna göre ayarlayabilirsiniz.

- Kevin Fairchild

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"; 
} 

çıktı o zaman:

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

Etrafta bir öğeyi "hareketli" aynı dizinin içindeki unsurların sırasını değiştiremez. Önce neyi ardından favori öğeleri vardır ve yeni bir dizi oluşturmak için bunu yapabilir sonunda orijinal ülkeler diziden başka bir şey ekler:

$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