2008-09-04 3 views
3

Dies ist ein PHP-Beispiel, aber ein Algorithmus für jede Sprache würde tun. Was ich speziell machen möchte, ist, die Vereinigten Staaten und Kanada an die Spitze der Liste zu bringen. Hier ist ein Beispiel für das Array kurz gekürzt.Da ich einen Hash von ID (Schlüssel) und Ländern (Werte) alphabetisch sortiert habe, was ist der beste Weg, um einen Eintrag an die Spitze des Stapels zu sprudeln?

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

Die ID muss intakt bleiben. Sie -1 oder -2 zu machen, wird leider nicht funktionieren.

Antwort

1

Meine Verknüpfung in ähnlichen Fällen ist ein Leerzeichen am Anfang von Kanada und zwei Leerzeichen am Anfang der Vereinigten Staaten hinzuzufügen. Wenn diese als Optionen in einem SELECT-Tag angezeigt werden, sind die Leerzeichen nicht sichtbar, aber die Sortierung bringt sie immer noch nach vorne.

Allerdings kann das in einigen Kontexten ein wenig hacky sein. In Java würde man StringComparator erweitern, die compare() -Methode außer Kraft setzen, um die Spezialfälle in den USA und Kanada zu machen, und dann die Liste (oder das Array) sortieren, die in Ihrem neuen Komparator als Sortieralgorithmus übergeben wird.

Allerdings könnte ich mir vorstellen, dass es einfacher ist, einfach die relevanten Einträge im Array zu finden, sie aus dem Array zu entfernen und sie am Anfang wieder hinzuzufügen. Wenn Sie in einem Framework sind, das das Array neu sortiert, funktioniert es möglicherweise nicht. Aber in den meisten Fällen wird das gut gehen.

[Bearbeiten] Ich sehe, dass Sie einen Hash und nicht ein Array verwenden - so hängt es davon ab, wie Sie die Sortierung tun. Könntest du einfach die USA in den Hash mit einem Schlüssel von -2 setzen, Kanada mit -1 und dann nach ID sortieren? Da ich 11 Jahre lang nicht in Wut mit PHP gearbeitet habe, kann ich mich nicht erinnern, ob es eine eingebaute Sortierung in seinen Hashes hat oder ob Sie das auf Anwendungsebene tun.

6

Normalerweise mache ich in diesen Situationen ein separates Feld namens DisplayOrder oder etwas ähnliches. Alles ist voreingestellt auf, sagen wir 1 ... Sie sortieren dann nach DisplayOrder und dann nach dem Namen. Wenn Sie etwas höher oder niedriger in der Liste haben möchten, können Sie die Anzeigereihenfolge entsprechend anpassen, während Sie Ihre normalen IDs beibehalten.

- Kevin pour

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

Der Ausgang ist dann:

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

Sie können nicht die Reihenfolge der Elemente innerhalb des gleichen Array ändern, indem Sie um ein Element "bewegt". Was können Sie es tun ein neues Array zu erstellen, die zuerst Ihre Lieblingsstücke hat und fügt dann noch etwas von der ursprünglichen Ländern Array am Ende:

$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

Verwandte Themen