ホームページ >php教程 >php手册 >php natsort カーネル関数の簡単な分析 ページ 1/2

php natsort カーネル関数の簡単な分析 ページ 1/2

WBOY
WBOYオリジナル
2016-06-13 12:22:331544ブラウズ

公式マニュアル (http://us.php.net/manual/en/function.natsort.php)

コードをコピー コードは次のとおりです。


bool natsort ( array &$array )
この関数は、キー/値を維持しながら人間が行う方法で英数字文字列を並べ替える並べ替えアルゴリズムを実装します。この関数は、キーと値の関連付けを維持しながら、人間が行うような方法で英数字文字列を並べ替えるアルゴリズムを実装します。このアルゴリズムと通常のコンピューター文字列並べ替えアルゴリズムの違いの例として説明されています。 (sort() で使用) は以下の例で見ることができます。


公式によると、マニュアルには次のようなものもあります:

img1.png img2.png img10 .png img12.png

明らかに、これは類似したファイル名を並べ替えるのに最適です。結果から判断すると、この自然なアルゴリズムは先頭と末尾の非数値部分を削除し、残りの数値部分をソートするはずです。それが正しいかどうかに関係なく、PHP のソース コードを見てみましょう。

コードをコピー コードは次のとおりです:


// ext/standard/array.c から抽出された関連コードは次のとおりです。以下のように
static int php_array_natural_general_compare(const void *a, const void *b, intfold_case) /* {{{ */
{
Bucket *f, *s
zval *fval; *sval;
zval 1 番目、2 番目;
f = *((バケット **) a);
s = *((バケット **)
fval = *(( zval **) f->pData);
sval = *((zval **) s->pData);
1 番目 = *fval; 2 番目 = *sval ;
if (Z_TYPE_P(fval) != IS_STRING) {
zval_copy_ctor(&first);
Convert_to_string(&second);
}
結果 = strnatcmp_ex(Z_STRVAL(first) )、Z_STRLEN(最初)、Z_STRVAL(2 番目)、Z_STRLEN(2 番目)、fold_case); (fval) != IS_STRING) {
zval_dtor(&first)
}
if (Z_TYPE_P(sval) ! = IS_STRING) {
zval_dtor(&second);
}
結果を返します
}
/* }}} */
static int php_array_natural_compare(const void *a, const void *b TSRMLS_DC) /* {{{ */
{
return php_array_natural_general_compare (a, b, 0);
}
/* }}} */
static void php_natsort(INTERNAL_FUNCTION_PARAMETERS) , intfold_case) /* {{{ */
{
zval * array;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE) {
return;
}
if (fold_case) {
if (zend_hash_sort(Z_ARRVAL_P (配列), zend_qsort, php_array_natural_case_compare, 0 TSRMLS_CC) == FAILURE) {
y)、zend_qsort、php_array_natural_compare、0 TSRMLS_CC) == FAILURE) {
&array_arg)
自然ソートを使用して配列を並べ替える */
PHP_FUNCTION(natsort)
{
php_natsort(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); 🎜 >/* }}} */


PHP のカーネル コードを表示するのは初めてですが、長年コードを読んできた経験があるため、カーネル コードの核となる部分を見つけるのは簡単です。この自然な並べ替えアルゴリズムは関数 strnatcmp_ex (ext/standard/strnatcmp.c ファイルの中央にあります) です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。