Maison  >  Article  >  développement back-end  >  Objets de comparaison de chaînes internationalisés en PHP

Objets de comparaison de chaînes internationalisés en PHP

藏色散人
藏色散人avant
2021-06-30 15:14:593103parcourir

Objets de comparaison de chaînes internationalisés en PHP

En PHP, les fonctions d'internationalisation sont très riches, y compris de nombreuses choses dont nous ne savons peut-être pas qu'elles sont en fait très utiles, comme Parlons de la série de fonctions de tri et de comparaison de caractères que nous allons présenter aujourd'hui.

Trier

Normalement, si on trie les caractères du tableau, ils sont classés dans l'ordre de la table de caractères ASC2. Si c'est en anglais, c'est. c'est bien, mais pour le chinois, les résultats triés seront très déroutants.

$arr = ['我','是','硬','核','项', '目', '经', '理'];
sort($arr);
var_dump( $arr );
// array(8) {
//     [0]=>
//     string(3) "我"
//     [1]=>
//     string(3) "是"
//     [2]=>
//     string(3) "核"
//     [3]=>
//     string(3) "理"
//     [4]=>
//     string(3) "目"
//     [5]=>
//     string(3) "硬"
//     [6]=>
//     string(3) "经"
//     [7]=>
//     string(3) "项"
//   }

Selon notre habitude, nous utilisons le pinyin chinois pour trier les caractères chinois. À l'heure actuelle, chacun choisit souvent d'écrire son propre algorithme de tri ou de trouver un package Composer approprié. En fait, PHP nous a préparé un objet pour gérer ce type de problème.

$coll = new Collator( 'zh_CN' );
$coll->sort($arr);
var_dump( $arr );
// array(8) {
//     [0]=>
//     string(3) "核"
//     [1]=>
//     string(3) "经"
//     [2]=>
//     string(3) "理"
//     [3]=>
//     string(3) "目"
//     [4]=>
//     string(3) "是"
//     [5]=>
//     string(3) "我"
//     [6]=>
//     string(3) "项"
//     [7]=>
//     string(3) "硬"
//   }

Oui, c'est la classe Collator. Il doit spécifier la zone actuelle lors de son instanciation. Par exemple, nous spécifions zh_CN, qui est la zone des caractères chinois. À ce stade, utilisez sa méthode sort() pour terminer le tri pinyin des caractères chinois. (Recommandé : Tutoriel vidéo PHP)

$coll->sort($arr, Collator::SORT_NUMERIC );
var_dump( $arr );
// array(8) {
//     [0]=>
//     string(3) "核"
//     [1]=>
//     string(3) "经"
//     [2]=>
//     string(3) "理"
//     [3]=>
//     string(3) "目"
//     [4]=>
//     string(3) "是"
//     [5]=>
//     string(3) "我"
//     [6]=>
//     string(3) "项"
//     [7]=>
//     string(3) "硬"
//   }
$coll->sort($arr, Collator::SORT_STRING );
var_dump( $arr );
// array(8) {
//     [0]=>
//     string(3) "核"
//     [1]=>
//     string(3) "经"
//     [2]=>
//     string(3) "理"
//     [3]=>
//     string(3) "目"
//     [4]=>
//     string(3) "是"
//     [5]=>
//     string(3) "我"
//     [6]=>
//     string(3) "项"
//     [7]=>
//     string(3) "硬"
//   }

La méthode sort() de l'objet Collator prend également en charge un deuxième paramètre, qui est utilisé pour spécifier si le tri actuel est basé sur des caractères ou des chiffres. format. Pour le contenu chinois pur, il n’y a aucune différence.

En plus de la méthode sort(), il dispose également d'une méthode asort(), qui a la même fonction que la fonction asort() ordinaire, sauf qu'elle prend également en charge différentes langues régionales. La méthode

$arr = [
    'a' => '100',
    'b' => '7',
    'c' => '50'
];
$coll->asort($arr, Collator::SORT_NUMERIC );
var_dump( $arr );
// array(3) {
//     ["b"]=>
//     string(1) "7"
//     ["c"]=>
//     string(2) "50"
//     ["a"]=>
//     string(3) "100"
//   }
$coll->asort($arr, Collator::SORT_STRING );
var_dump( $arr );
// array(3) {
//     ["a"]=>
//     string(3) "100"
//     ["c"]=>
//     string(2) "50"
//     ["b"]=>
//     string(1) "7"
//   }
$arr = [
    '中' => '100',
    '的' => '7',
    '文' => '50'
];
$coll->asort($arr, Collator::SORT_NUMERIC );
var_dump( $arr );
// array (
//     '的' => '7',
//     '文' => '50',
//     '中' => '100',
//   )
$coll->asort($arr, Collator::SORT_STRING );
var_dump( $arr );
// array (
//     '中' => '100',
//     '文' => '50',
//     '的' => '7',
//   )

asrot() trie en fonction des clés et des valeurs ensemble, donc spécifier SORT_STRING et SORT_NUMERIC ici a des effets évidents. Nous pouvons voir que s'il est trié en fonction de nombres, alors les résultats sont basés sur le contenu numérique. S'il est trié en fonction de caractères, alors les résultats sont triés en fonction de la partie chaîne de la valeur clé.

Les fonctions sort() et asrot() sont essentiellement les mêmes que les fonctions sort() et asrot() fournies par défaut par PHP ordinaire. C'est juste qu'ils ont davantage de fonctions linguistiques régionales.

De plus, l'objet Collator fournit également une méthode sortWithSortKeys(), qui n'est pas disponible dans les fonctions de tri PHP ordinaires.

$arr = ['我','是','硬','核','项', '目', '经', '理'];
$coll->sortWithSortKeys($arr);
var_dump( $arr );
// array (
//     0 => '核',
//     1 => '经',
//     2 => '理',
//     3 => '目',
//     4 => '是',
//     5 => '我',
//     6 => '项',
//     7 => '硬',
//   )

Elle est similaire à la méthode sort(), mais utilise ucol_getSortKey() pour générer la clé de tri ICU, qui est plus rapide sur les grands tableaux.

Le nom complet d'ICU est International Components for Unicode, qui est le composant international d'Unicode. Il fournit des fonctions liées à la traduction, qui constituent la base des capacités d'internationalisation de notre système et de divers langages de programmation.

Comparaison

L'étape suivante est la comparaison des chaînes. Par exemple, nous savons tous que "a" est plus grand que "A" car dans la table de codes ASC2. Dans , « A » vaut 65 et « a » vaut 97. Bien sûr, il ne s'agit que d'une comparaison par défaut. Lorsque vous utilisez la fonction de l'objet Collator pour la comparaison, la comparaison est basée sur l'index de tri de la bibliothèque de dictionnaires. Pour le chinois, elle est essentiellement comparée dans l'ordre du pinyin. La méthode

var_dump($coll->compare('Hello', 'hello')); // int(1)
var_dump($coll->compare('你好', '您好')); // int(-1)

compare() est utilisée pour la comparaison. Si les deux chaînes sont égales, 0 est renvoyée. Si la première chaîne est supérieure à la seconde, 1 est renvoyé. . D'après le code, nous pouvons voir que "Bonjour" est supérieur à "bonjour" et "bonjour" est inférieur à "bonjour" (car "vous" a un g supplémentaire).

Paramètres de propriété

Les objets Collator peuvent également définir certaines propriétés d'objet.

$coll->setAttribute(Collator::CASE_FIRST, Collator::UPPER_FIRST);
var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(25)
var_dump($coll->compare('Hello', 'hello')); // int(-1)
$coll->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST);
var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(24)
var_dump($coll->compare('Hello', 'hello')); // int(1)
$coll->setAttribute(Collator::CASE_FIRST, Collator::OFF);
var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(16)
var_dump($coll->compare('Hello', 'hello')); // int(1)

Ici, nous spécifions l'attribut CASE_FIRST pour l'objet. La valeur de l'attribut peut spécifier d'abord les majuscules, les minuscules d'abord, etc. Pour les caractères anglais, cela peut affecter les résultats du tri et de la comparaison.

De plus, nous pouvons également obtenir les informations linguistiques régionales actuelles grâce à une méthode.

var_dump($coll->getLocale(Locale::VALID_LOCALE)); // string(10) "zh_Hans_CN"
var_dump($coll->getLocale(Locale::ACTUAL_LOCALE)); // string(2) "zh"

Ces deux paramètres visent respectivement à obtenir des informations de configuration régionale efficaces et des informations régionales réelles.

Informations de tri

Bien sûr, nous pouvons également voir les informations de tri spécifiques, qui sont l'encodage des caractères dans Collator.

var_dump(bin2hex($coll->getSortKey('Hello'))); // string(20) "b6b0bebec4010901dc08"
var_dump(bin2hex($coll->getSortKey('hello'))); // string(18) "b6b0bebec401090109"
var_dump(bin2hex($coll->getSortKey('你好'))); // string(16) "7b9b657301060106"
var_dump(bin2hex($coll->getSortKey('您好'))); // string(16) "7c33657301060106"
$coll = collator_create( 'en_US' );
var_dump($coll->compare('Hello', 'hello')); // int(1)
var_dump($coll->compare('你好', '您好')); // int(-1)
var_dump($coll->getLocale(Locale::VALID_LOCALE)); // string(5) "en_US"
var_dump($coll->getLocale(Locale::ACTUAL_LOCALE)); // string(4) "root"
var_dump(bin2hex($coll->getSortKey('Hello'))); // string(20) "3832404046010901dc08"
var_dump(bin2hex($coll->getSortKey('hello'))); // string(18) "383240404601090109"
var_dump(bin2hex($coll->getSortKey('你好'))); // string(20) "fb0b8efb649401060106"
var_dump(bin2hex($coll->getSortKey('您好'))); // string(20) "fba5f8fb649401060106"

On peut voir que les informations sur la clé de tri getSortKey() obtenues dans différentes langues régionales sont différentes, mais elles sont toutes stockées en hexadécimal, ce qui est complètement différent du code ASC2 par défaut.

Message d'erreur

$coll = new Collator( 'en_US' );;
$coll->compare( 'y', 'k' ); 
var_dump($coll->getErrorCode()); // int(0)
var_dump($coll->getErrorMessage()); // string(12) "U_ZERO_ERROR"

Utilisez getErrorCode() pour obtenir le code d'erreur et getErrorMessage() pour obtenir le message d'erreur. Aucune information pertinente n'a été trouvée concernant le U_ZERO_ERROR renvoyé. J'espère que des amis bien informés pourront répondre avec des explications afin que nous puissions tous apprendre ensemble.

Force de la règle de coloration

De plus, l'objet Collator a également un paramètre de force de tri, mais l'effet de mon test n'a pas été reflété.

$arr  = array( 'a', 'à' ,'A');
$coll = new Collator( 'de_DE' );
$coll->sort($arr);
var_dump($coll->getStrength());
var_dump( $arr ); // int(2)
// array(3) {
//     [0]=>
//     string(1) "a"
//     [1]=>
//     string(1) "A"
//     [2]=>
//     string(2) "à"
//   }
$coll->setStrength(Collator::IDENTICAL);
var_dump($coll->getStrength()); // int(15)
$coll->sort($arr);
var_dump( $arr );
$coll->setStrength(Collator::QUATERNARY);
var_dump($coll->getStrength()); // int(3)
$coll->sort($arr);
var_dump( $arr );
$coll->setStrength(Collator::PRIMARY);
var_dump($coll->getStrength()); // int(0)
$coll->sort($arr );
var_dump( $arr );
$coll->setStrength(Collator::TERTIARY);
var_dump($coll->getStrength()); // int(2)
$coll->sort($arr );
var_dump( $arr );
$coll->setStrength(Collator::SECONDARY);
var_dump($coll->getStrength()); // int(1)
$coll->sort($arr );
var_dump( $arr );

Dans les résultats du code de test dans la documentation officielle, la spécification de différents paramètres renverra des ordres de tri différents, mais les résultats de mon test actuel sont tous les mêmes. Je ne l’expliquerai donc pas ici parce que je ne comprends pas pourquoi. Il suffit que tout le monde comprenne. Si vous avez des amis qui ont des connaissances claires dans ce domaine, veuillez laisser un message et répondre pour apprendre ensemble !

Résumé

很有意思的一个对象吧,其实这个对象也是支持面向过程式的函数写法的,在示例代码中也有使用面向过程的方式的调用的。总体来说,按拼音排序和比较这两个功能在实际的开发中相信还是有不少用武之地的,大家可以尝试看看哦!

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/3.PHP中国际化的字符串比较对象.php
参考文档:
https://www.php.net/manual/zh/class.collator.php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer