2016-07-03 12 views
0

Ich habe eine PHP-Array haben eine Liste der Länder enthalten:Der Versuch, ein mehrdimensionales Array zu sortieren, von einem Unterwert mit Sonderzeichen

$countries = array(
    'AX' => 'Åland Islands', 
    'AF' => 'Afghanistan', 
    'GB' => 'United Kingdom' 
); 

$collator = collator_create('en'); 
collator_asort($collator, $countries, Collator::SORT_STRING); 

Offensichtlich ist diese Liste viel kürzer für dieses Beispiel ist, aber das Sortieren funktionierte hier. Ich erwartete, und bekam:

  • Afghanistan
  • Åland-Inseln
  • Vereinigtes Königreich

aber ich brauchte mehr Daten hinzuzufügen, und es wurde mehrdimensional:

$countries = array(
    array(
    'name' => 'Åland Islands', 
    'code' => 'AX' 
), 
    array(
    'name' => 'Afghanistan', 
    'code' => 'AF' 
), 
    array(
    'name' => 'United Kingdom', 
    'code' => 'GB' 
) 
); 

usort($countries, function($a, $b){ return $a['name'] <=> $b['name']; }); 

Es sortiert jedes andere Land in der Liste, aber gibt mir das:

  • Afghanistan
  • Vereinigtes Königreich
  • Åland-Inseln

Ich kann nicht für das Leben von mir herauszufinden, wie diese richtig zu sortieren. Ich stelle fest, dass im aktuellen Zustand kein Collator aufgerufen oder angewendet wird, aber gibt es eine Möglichkeit, den Collator in einer mehrdimensionalen Umgebung arbeiten zu lassen?

Antwort

4

Unten ist eine mögliche Lösung basierend auf Ihrer ursprünglichen a NSATZ:

usort($countries, function($a, $b) { 
    $collator = collator_create('en'); 
    $arr = array($a['name'], $b['name']); 
    collator_asort($collator, $arr, Collator::SORT_STRING); 

    return array_pop($arr) == $a['name']; 
}); 

Für eine optimale Leistung auf lange Listen, möchten Sie vielleicht $ collator nur einmal außerhalb des Rahmens der anonymen Funktion, obwohl instanziiert.

+0

Das funktioniert gut, und behält die Collator, die ich wollte, zu tun. Ich habe einige schnelle Leistungstests durchgeführt und es scheint das Skript überhaupt nicht zu verlangsamen. Vielen Dank! –

+0

Froh, dass es Ihren Bedürfnissen entspricht. Beachten Sie, dass die Schlüssel von $ arr nicht beibehalten werden müssen. So können Sie 'kollator_asort()' durch 'kollator_sort()' und 'array_pop ($ arr) == $ a ['name'];' mit '$ arr [1] == $ a ['name'] ersetzen ; 'Es sollte etwas schneller sein. – Arnauld

1

Um die „Länderliste“ ohne Collator sortieren Sie alle Wörter mit betont Zeichen in seine ASCII Präsentation (zB Å-A) unter Verwendung von iconv Funktion umwandeln sollte:

usort($countries, function($a, $b){ 
    return strcasecmp(iconv('utf-8', 'ascii//TRANSLIT', $a['name']), iconv('utf-8', 'ascii//TRANSLIT', $b['name']));  
}); 

print_r($countries); 

Der Ausgang:

Array 
(
    [0] => Array 
     (
      [name] => Afghanistan 
      [code] => AF 
     ) 

    [1] => Array 
     (
      [name] => Åland Islands 
      [code] => AX 
     ) 

    [2] => Array 
     (
      [name] => United Kingdom 
      [code] => GB 
     ) 
) 
+0

Interessanterweise platziert dies tatsächlich Åland-Inseln ** vor ** Afghanistan in meinem Code. Allerdings könnte ich mit behalten Collator für i18n Zwecke –