2008-09-04 28 views
3

Ceci est un exemple de php, mais un algorithme pour n'importe quelle langue ferait l'affaire. Ce que je veux spécifiquement faire, c'est faire grimper les États-Unis et le Canada au sommet de la liste. Voici un exemple du tableau raccourci pour la brièveté.Étant donné que j'ai un hash de id (clé) et que les pays (valeurs) sont triés par ordre alphabétique, quelle est la meilleure façon de faire passer une entrée en haut de la pile?

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

Les identifiants doivent rester intacts. Donc, les faire -1 ou -2 ne fonctionnera malheureusement pas.

Répondre

1

Mon raccourci dans des cas similaires est d'ajouter un espace au début du Canada et deux espaces au début des États-Unis. Si vous les affichez en tant qu'options dans un tag SELECT, les espaces ne sont pas visibles mais le tri les amène au premier plan.

Cependant, cela peut être un peu hacky dans certains contextes. En Java, la chose à faire serait d'étendre StringComparator, de surcharger la méthode compare() en faisant des cas spéciaux aux États-Unis et au Canada, puis de trier la liste (ou tableau) passant dans votre nouveau comparateur comme algorithme de tri.

Cependant, j'imagine qu'il serait peut-être plus simple de simplement trouver les entrées pertinentes dans le tableau, de les retirer du tableau et de les rajouter au début. Si vous êtes dans une sorte de cadre qui va re-trier le tableau, alors cela pourrait ne pas fonctionner. Mais dans la plupart des cas, cela ira très bien. Je vois que vous utilisez un hachage et non un tableau - donc cela dépendra de la façon dont vous faites le tri. Pourriez-vous simplement mettre les États-Unis dans le hachage avec une clé de -2, Canada avec -1 et ensuite trier par ID à la place? N'ayant pas utilisé PHP dans la colère depuis 11 ans, je ne me souviens pas s'il a intégré le tri dans ses hachages ou si vous le faites au niveau de l'application.

6

Ce que je fais habituellement dans ces situations est d'ajouter un champ séparé appelé DisplayOrder ou quelque chose de similaire. Tout est par défaut à, disons, 1 ... Vous ensuite trier par DisplayOrder, puis le nom. Si vous voulez quelque chose de plus haut ou plus bas dans la liste, vous pouvez ajuster l'ordre d'affichage en conséquence tout en gardant vos ID normaux tels quels.

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

La sortie est alors:

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

Vous ne pouvez pas modifier l'ordre des éléments dans le même tableau en "mouvement" autour d'un élément. Ce que vous pouvez faire pour construire un nouveau tableau qui a d'abord vos articles préférés et ajoute tout le reste du tableau des pays d'origine à la fin:

$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