Ben (key) id karma ve ülkeler (değerler) alfabetik olarak sıralanmış olması göz önüne alındığında, kabarcık kadar yığının üstüne bir giriş için en iyi yolu nedir?

5 Cevap php

Bu bir php örnek, ancak herhangi bir dil için bir algoritma yapardı. Ne özellikle yapmak istediğiniz listenin üst kabarcık kadar Amerika Birleşik Devletleri ve Kanada olduğunu. Burada kısalık için kısaltılmış dizinin bir örnektir.

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

Id en sağlam kalmak gerekir. Yani onları -1 veya -2 maalesef çalışmaz hale.

5 Cevap

Ne genellikle bu durumlarda yapılacaklar displayorder veya benzeri bir şey olarak adlandırılan ayrı bir alan eklemek için. 1, diyelim ki, her şey varsayılan ... Daha sonra sıralama displayorder tarafından ve daha sonra adı. Eğer listede bir şey daha yüksek veya daha düşük isterseniz olduğu gibi-normal kimlikleri tutarken, buna göre görüntü sırasını çimdik.

- Kevin Fairchild

Benzer davalarda Benim kısayol ABD'nin başında Kanada ve iki mekanların başında bir boşluk eklemek için. SELECT etiketi seçenek olarak bu görüntüleme ise, alanlarda görünür değil ama sıralama yine önüne getiriyor.

Ancak, bazı bağlamlarda biraz hacky olabilir. Java'da yapılacak şey sıralama algoritması olarak yeni karşılaştırıcıda geçirmeden StringComparator uzatmak ABD ve Kanada özel durumlarda yapım karşılaştırma () yöntemini geçersiz, daha sonra liste (veya dizi) sıralamak olacaktır.

Ancak ben sadece, dizideki ilgili girdileri bulmak diziden bunları kaldırmak ve başında tekrar eklemek için basit olabilir hayal ediyorum. Eğer diziyi yeniden sıralamak çerçevesinin bazı tür iseniz, o zaman işe yaramayabilir. Ancak çoğu durumda sadece iyi yapacağız.

[Değiştir] Ben bir dizi değil, bir hash kullanarak ve görüyoruz - yani bu sıralamayı yaptığını nasıl bağlıdır. Sadece yerine KODU sıralama sonra -1 ile Kanada, -2 anahtar ile karma içine ABD'yi koymak olabilir? 11 yıldır öfke içinde PHP kullanılan sahip değil, bunu yerleşik olmadığını uygulama düzeyinde yapıyorsun kendi sağlamalarının sıralama veya eğer hatırlamıyorum.

$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ısı daha sonra, bir:

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

Ben orada verilerin geri kalanını yerleştirmeden önce şu anda ben sadece karma yerleştirerek ediyorum. Sonra ben sadece üzerlerine atlamak sonuç kümesi üzerinde zaman döngü.

Etrafta bir öğe "hareket" ile aynı dizideki elemanların sırasını değiştiremezsiniz. Eğer ilk favori öğeleri vardır ve sonra sonunda orijinal ülkeler diziden başka bir şey ekler, yeni bir dizi oluşturmak için neler yapabiliriz:

$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