PHP の国際化された文字列比較オブジェクト

リリース: 2023-04-10 09:58:02
転載
3094 人が閲覧しました

PHP の国際化された文字列比較オブジェクト

PHP では、国際化関数が非常に豊富で、実際には非常に便利であることが知られていない多くの機能が含まれています。今回紹介する文字ソートと比較関数について説明します。

ソート

通常、配列内の文字をソートすると、ASC2 文字テーブルの順序で配列されます。問題ありませんが、中国語の場合、並べ替えられた結果は非常にわかりにくくなります。

$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) "项"
//   }
ログイン後にコピー

私たちの習慣によれば、中国語の文字を並べ替えるには中国語のピンインを使用しますが、現時点では、誰もが独自の並べ替えアルゴリズムを作成するか、適切な Composer パッケージを見つけることを選択することがよくあります。実際、PHP はこの種の問題を処理するためのオブジェクトを用意しています。

$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) "硬"
//   }
ログイン後にコピー

はい、この Collat​​or クラスです。インスタンス化する際にカレント領域を指定する必要がありますが、例えば漢字領域であるzh_CNを指定し、そのsort()メソッドを使用して中国語のピンインソートを完了させます。 (推奨: 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) "硬"
//   }
ログイン後にコピー

Collat​​or オブジェクトの sort() メソッドは、現在の並べ替えが文字に基づくか数値に基づくかを指定するために使用される 2 番目のパラメーターもサポートしています。フォーマット。純粋な中国語コンテンツの場合、違いはありません。

sort() メソッドに加えて、asort() メソッドもあります。このメソッドは通常の asort() 関数と同じ機能を持ちますが、異なる地域言語もサポートしている点が異なります。

$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() メソッドはキーと値に基づいて並べ替えるので、ここで SORT_STRING と SORT_NUMERIC を指定すると、明らかな効果があります。数値に基づいて並べ替えられた場合、結果は数値の内容に基づいて並べ替えられ、文字に基づいて並べ替えられた場合、結果はキー値の文字列部分に基づいて並べ替えられることがわかります。

sort() と asrot() はどちらも、通常の PHP がデフォルトで提供する sort() 関数と asrot() 関数と本質的に同じです。地域言語機能が増えただけです。

さらに、Collat​​or オブジェクトは、通常の PHP 並べ替え関数では使用できない sortWithSortKeys() メソッドも提供します。

$arr = ['我','是','硬','核','项', '目', '经', '理'];
$coll->sortWithSortKeys($arr);
var_dump( $arr );
// array (
//     0 => '核',
//     1 => '经',
//     2 => '理',
//     3 => '目',
//     4 => '是',
//     5 => '我',
//     6 => '项',
//     7 => '硬',
//   )
ログイン後にコピー

これは sort() メソッドに似ていますが、ucol_getSortKey() を使用して ICU ソート キーを生成します。これは、大規模な配列では高速です。

ICU の正式名称は International Components for Unicode で、Unicode の国際コンポーネントであり、システムの国際化機能や各種プログラミング言語の基盤となる翻訳関連機能を提供します。

比較

次のステップは文字列の比較です。たとえば、ASC2 コード テーブルでは "a" が "A" よりも大きいことは誰もが知っています。では、「A」は 65、「a」は 97 です。もちろん、これはデフォルトでの比較であり、Collat​​or オブジェクトの機能を使用して比較する場合は、辞書ライブラリのソートインデックスに基づいて比較されますが、中国語の場合は基本的にピンイン順に比較されます。

var_dump($coll->compare('Hello', 'hello')); // int(1)
var_dump($coll->compare('你好', '您好')); // int(-1)
ログイン後にコピー

compare() メソッドは比較に使用されます。2 つの文字列が等しい場合は 0 が返されます。最初の文字列が 2 番目の文字列より大きい場合は 1 が返されます。それ以外の場合は 0 が返されます。 -1 。コードから、「Hello」は「hello」より大きく、「hello」は「hello」より小さいことがわかります(「you」には余分な g があるため)。

プロパティ設定

一部のオブジェクト プロパティは、Collat​​or オブジェクトでも設定できます。

$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)
ログイン後にコピー

ここでは、オブジェクトの CASE_FIRST 属性を指定します。属性値では、大文字が最初、小文字が最初などを指定できます。英語の文字の場合、これは並べ替えと比較の結果に影響を与える可能性があります。

さらに、メソッドを通じて現在の地域の言語情報を取得することもできます。

var_dump($coll->getLocale(Locale::VALID_LOCALE)); // string(10) "zh_Hans_CN"
var_dump($coll->getLocale(Locale::ACTUAL_LOCALE)); // string(2) "zh"
ログイン後にコピー

これら 2 つのパラメータは、有効な地域設定情報と実際の地域情報を取得するためのものです。

ソート情報

もちろん、Collat​​or の文字のエンコーディングである特定のソート情報も確認できます。

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"
ログイン後にコピー

getSortKey() のソートキー情報は地域言語ごとに異なりますが、すべて 16 進数で格納されており、デフォルトの ASC2 コードとはまったく異なります。

エラー メッセージ

$coll = new Collator( 'en_US' );;
$coll->compare( 'y', 'k' ); 
var_dump($coll->getErrorCode()); // int(0)
var_dump($coll->getErrorMessage()); // string(12) "U_ZERO_ERROR"
ログイン後にコピー

getErrorCode() を使用してエラー コードを取得し、getErrorMessage() を使用してエラー メッセージを取得します。返された U_ZERO_ERROR に関して関連する情報は見つかりませんでした。知識のある友人が説明とともに返信してくれることを願っており、一緒に学ぶことができます。

ソートルールの強度

また、Collat​​orオブジェクトにもソート強度の設定がありますが、今回のテストの効果は反映されませんでした。

$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 );
ログイン後にコピー

公式ドキュメントのテストコードの結果では、異なるパラメータを指定すると異なるソート順が返されますが、実際のテストの結果はすべて同じでした。理由がわからないのでここでは説明しません。誰でも理解できる内容なので、この知識を知っている友達がいたら、ぜひメッセージとリプライを残して一緒に学びましょう!

要約

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

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

以上がPHP の国際化された文字列比較オブジェクトの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:硬核项目经理
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!