明らかに、これは類似したファイル名の並べ替えに非常に適しています。結果から判断すると、この自然なアルゴリズムは先頭と末尾の非数値部分を削除し、残りの数値部分をソートするはずです。それが正しいかどうかに関係なく、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 ファイル)。
http://www.bkjia.com/PHPjc/320396.htmlwww.bkjia.comtruehttp://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最初、二番目...