php natsort核心功能淺析第1/2頁_php技巧

來源:互聯網
上載者:User

官方手冊(http://us.php.net/manual/en/function.natsort.php)

複製代碼 代碼如下:

bool natsort ( array &$array )
This function implements a sort algorithm that orders alphanumeric strings in the way a human being would while maintaining key/value associations. This is described as a "natural ordering". An example of the difference between this algorithm and the regular computer string sorting algorithms (used in sort()) can be seen in the example below.

據官方手冊還可以得到這樣的結果:

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, int fold_case) /* {{{ */
{
    Bucket *f, *s;
    zval *fval, *sval;
    zval first, second;
    int result;
    f = *((Bucket **) a);
    s = *((Bucket **) b);
    fval = *((zval **) f->pData);
    sval = *((zval **) s->pData);
    first = *fval;
    second = *sval;
    if (Z_TYPE_P(fval) != IS_STRING) {
        zval_copy_ctor(&first);
        convert_to_string(&first);
    }
    if (Z_TYPE_P(sval) != IS_STRING) {
        zval_copy_ctor(&second);
        convert_to_string(&second);
    }
    result = strnatcmp_ex(Z_STRVAL(first), Z_STRLEN(first), Z_STRVAL(second), Z_STRLEN(second), fold_case);
    if (Z_TYPE_P(fval) != IS_STRING) {
        zval_dtor(&first);
    }
    if (Z_TYPE_P(sval) != IS_STRING) {
        zval_dtor(&second);
    }
    return result;
}
/* }}} */
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, int fold_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(array), zend_qsort, php_array_natural_case_compare, 0 TSRMLS_CC) == FAILURE) {
            return;
        }
    } else {
        if (zend_hash_sort(Z_ARRVAL_P(array), zend_qsort, php_array_natural_compare, 0 TSRMLS_CC) == FAILURE) {
            return;
        }
    }
    RETURN_TRUE;
}
/* }}} */
/* {{{ proto void natsort(array &array_arg)
Sort an array using natural sort */
PHP_FUNCTION(natsort)
{
    php_natsort(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}
/* }}} */

雖然是第一次查看php的核心代碼,不過憑藉多年看代碼的經驗,還是很容易找到這個自然排序演算法的核心就是函數:strnatcmp_ex(位於ext/standard/strnatcmp.c檔案中)。
當前1/2頁  12下一頁閱讀全文
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.