2015-04-30 1 views
3

J'ai un tableau, chaque élément contient un premier et un nom de famille:tri des noms chinois en PHP

$input = [ 
    [ 
    'firstName' => 'foo', 
    'lastName' => 'bar', 
    ] 
]; 

Pour la plupart des utilisateurs, ils sont la plupart du temps dans l'alphabet latin, mais certains sont écrits en chinois.

Comment trier cette liste de noms en utilisant PHP?

Je suis également curieux de connaître les conventions. Je sais que dans les langues utilisant l'alphabet latin-1, parfois le prénom vient en premier, et d'autres fois le dernier. Je suis curieux de savoir si cette situation est similaire dans le mandarin, ou si l'un est généralement préféré à l'autre. Et enfin, je suis curieux de savoir s'il y a une différence entre le tri des noms et le tri des mots, comme dans un dictionnaire.

+0

Une notion de base pour tout tri est que vous devez avoir des éléments qui peuvent être comparés. Je ne vois pas cela si les données contiennent des caractères latins et des caractères chinois. – BigScar

+1

Il ne semble pas que le chinois a même un ensemble de règles strictes de l'ordre des caractères: http://www.cantonese.sheik.co.uk/phorum/read.php?1,122672,122681 –

+1

@BigScar one L'option est que si une liste de noms contient des noms latins et chinois mélangés, il suffit de choisir l'un de ces deux noms et de l'afficher en premier. Je suis plus préoccupé par le bon tri des noms chinois entre eux. Curieux s'il y a quelques bonnes pratiques là-bas. – Evert

Répondre

0

Question vraiment intéressante! Chaque caractère a une valeur Unicode. La plupart du tri est fait à travers cela. Puisque les lettres latines sont dans la gamme ASCII, ces noms apparaissent toujours en premier. La fonction asort de PHP prendra en compte Unicode. Voici une entrée à considérer:

$input = [ 
    [ 
     "firstName" => "一", 
     "lastName" => "風" 
    ], 
    [ 
     "firstName" => "이", 
     "lastName" => "정윤" 
    ], 
    [ 
     "firstName" => "Mari", 
     "lastName" => "M" 
    ], 
    [ 
     "firstName" => "三", 
     "lastName" => "火" 
    ], 
]; 

Résumons ce que j'attends de voir, en supposant que nous trier par le premier nom:

  • nom latin d'abord (Mari M)
  • Hanzi/kanjis/hangeul noms suivants. Je ne sais pas quelles sont les valeurs de ces noms, nous devons donc le découvrir.

Nous allons convertir le premier caractère des premiers noms en quelque chose de numérique.Encore une fois, nous utilisons Unicode pour cette conversion:

  • 一 est 0x4E00
  • 이 est 0xC774
  • M est 0x004D
  • 三 est 0x4E09

En tant que tel, je me attends à voir dans l'ordre:

  • M

Voici mon code, en utilisant asort:

$nameByFirst = []; 
foreach($input as $i) 
{ 
    $nameByFirst[] = $i["firstName"]." ".$i["lastName"]; 
} 
asort($nameByFirst); 

Et ma méthode d'impression:

$i = 1; 
foreach($nameByFirst as $name) 
{ 
    echo $i.'. '.$name."<br>"; 
    $i++; 
} 

Et ma sortie:

  1. Mari M
  2. 一 風
  3. 三 火
  4. 이 정윤

Mes résultats, comme vous pouvez le voir ci-dessus, sont en ordre. Le latin d'abord, puis hanzi/kanji, puis hangeul. Unicode est le plus proche que je crois que nous pouvons obtenir un tri facile, alors j'aime aller par là. Je ne suis pas sûr à 100% de la façon dont Unicode attribue des valeurs à hanzi/kanji/hangeul, mais je suis prêt à faire confiance à l'ordre qu'ils ont donné, surtout à cause de la simplicité de son utilisation.

+0

asort trie généralement en fonction des valeurs d'octets, pas de codes Unicode, donc je sais que cette solution ne peut pas être complète. De nombreuses langues ont des modificateurs dans diverses formes de normalisation Unicode qui désordre avec l'ordre. Même pour latin1, vous pourriez considérer incorrect si un nom ou un prénom a été épelé sans majuscule. – Evert

+0

Fair point. Pour les scripts latins, le concept de lettres majuscules existe, mais pas pour les autres langues. Je vois cependant le point, puisque chaque langue a ses propres moyens d'ordre alphabétique. Je vais y réfléchir un peu plus. Voici la lecture liée cependant: http: // stackoverflow.com/questions/5698226/sort-pour-japonais –

+0

Cela existe: http://php.net/manual/fr/collator.construct.php Mais l'inconvénient est que j'ai besoin de lui fournir la langue pour le tri. C'est difficile parce que mon cas d'utilisation est essentiellement un carnet d'adresse massif dont je ne connais pas les locales à l'avance =) – Evert