ホームページ  >  記事  >  バックエンド開発  >  php natsort カーネル関数の簡単な分析 ページ 1/2_PHP チュートリアル

php natsort カーネル関数の簡単な分析 ページ 1/2_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:45:151118ブラウズ

公式マニュアル (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) /* {{ */
{ バケット *f, *s;
zval *fval, *sval;
int 結果; ;
s = *( (バケット **) b);
fval = *((zval **) f->pData);
sval = *((zval **) s->pData); = *fval;
2 番目 = *sval;
if (Z_TYPE_P(fval) != IS_STRING) {
Convert_to_string(&first) }
if (Z_TYPE_P(sval) != IS_STRING) zval_copy_ctor (&秒);

}
result = strnatcmp_ex(Z_STRVAL(最初), Z_STRLEN(最初); VAL(秒)、Z_STRLEN(秒)、fold_case)
if (Z_TYPE_P(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) /* {{{ * // If (zend_hash_sort(Z_ARRVAL_P(array), zend_qsort, php_array_natural_case_compare, 0 TSRMLS_CC) == FAILURE) {
php_array_natural_compare, 0 TSRMLS_CC) == FAILURE) {

RETURN_TRUE
}
/* } }} */
/* {{{ proto void natsort(array &array_arg)
自然ソートを使用して配列をソートします */
PHP_FUNCTION(natsort)
{
php_natsort(INTERNAL_FUNCTION_PARAM _PASSTHRU, 0)
}
/* }}} */


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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/320396.html技術記事公式マニュアル (http://us.php.net/manual/en/function.natsort.php) 以下のコードをコピーします: bool natsort (array nbsp;Bucket *f, *s; zval *fval, *sval; zval最初、二番目...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。