最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php natsort內(nèi)核函數(shù)淺析第1/2頁

 更新時間:2009年08月10日 10:32:08   作者:  
今天發(fā)現(xiàn)了php有個自然排序的函數(shù)----natsort,第一次聽說了原來還有一種叫做“自然排序”的算法,很好奇

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

復(fù)制代碼 代碼如下:

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.

據(jù)官方手冊還可以得到這樣的結(jié)果:

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

顯然這很適合對類似文件名的排序。從結(jié)果看這種自然算法應(yīng)該是去掉頭和尾的非數(shù)字部分,然后對留下來的數(shù)字部分進(jìn)行排序,究竟是不是,還是看一下php源碼吧。
復(fù)制代碼 代碼如下:

//從ext/standard/array.c抽取的相關(guān)代碼如下
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的內(nèi)核代碼,不過憑借多年看代碼的經(jīng)驗,還是很容易找到這個自然排序算法的核心就是函數(shù):strnatcmp_ex(位于ext/standard/strnatcmp.c文件中)。

相關(guān)文章

  • PHP學(xué)習(xí)之?dāng)?shù)組的定義和填充

    PHP學(xué)習(xí)之?dāng)?shù)組的定義和填充

    先了解一下數(shù)組,數(shù)組就是把一組數(shù)據(jù)按順序放在一起。PHP的數(shù)組和其它的語言數(shù)組有一點(diǎn)點(diǎn)不同:第一,保存的數(shù)據(jù)是可以是任何類型的;第二,數(shù)組的索引可以是數(shù)字,也可以是字符串。
    2011-04-04
  • 一些php技巧與注意事項分析

    一些php技巧與注意事項分析

    很多人寫程序時,用 header(location) 進(jìn)行跳轉(zhuǎn)往往不記得寫 exit() 語句,事實上這種做法是存在嚴(yán)重風(fēng)險的。
    2011-02-02
  • php接口報錯解決分析記錄

    php接口報錯解決分析記錄

    記一次解決php接口報錯 The GET method is not supported for this route. Supported methods: POST.的bug,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • PHP使用內(nèi)置函數(shù)生成圖片的方法詳解

    PHP使用內(nèi)置函數(shù)生成圖片的方法詳解

    這篇文章主要介紹了PHP使用內(nèi)置函數(shù)生成圖片的方法,結(jié)合實例形式詳細(xì)分析了php生成圖片的步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2016-05-05
  • 關(guān)于PHP數(shù)組迭代器的使用方法實例

    關(guān)于PHP數(shù)組迭代器的使用方法實例

    在PHP的日常操作中,數(shù)組是最常出現(xiàn)的結(jié)構(gòu),而我們幾乎每天都在處理數(shù)組相關(guān)的內(nèi)容,這篇文章主要給大家介紹了關(guān)于PHP數(shù)組迭代器的使用方法,需要的朋友可以參考下
    2021-11-11
  • PHP使用CURL模擬登錄的方法

    PHP使用CURL模擬登錄的方法

    本文給大家介紹的是PHP使用CURL模擬登錄的方法,思路和其他模擬登陸的程序不同,有需要的小伙伴可以詳細(xì)看下。
    2015-07-07
  • PHP生成指定隨機(jī)字符串的簡單實現(xiàn)方法

    PHP生成指定隨機(jī)字符串的簡單實現(xiàn)方法

    這篇文章主要介紹了PHP生成指定隨機(jī)字符串的簡單實現(xiàn)方法,涉及php操作數(shù)組與字符串的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • PHP中錯誤與異常的日志記錄用法分析

    PHP中錯誤與異常的日志記錄用法分析

    這篇文章主要介紹了PHP中錯誤與異常的日志記錄用法,較為詳細(xì)的分析了php中錯誤與異常的區(qū)別以及日志記錄的相應(yīng)使用技巧,需要的朋友可以參考下
    2016-08-08
  • ThinkPHP中公共函數(shù)路徑和配置項路徑的映射分析

    ThinkPHP中公共函數(shù)路徑和配置項路徑的映射分析

    這篇文章主要介紹了ThinkPHP中公共函數(shù)路徑和配置項路徑的映射,較為通俗的分析了ThinkPHP中公共函數(shù)路徑和配置項路徑的映射關(guān)系與對應(yīng)修改位置,有助于更好的理解ThinkPHP底層代碼原理,需要的朋友可以參考下
    2014-11-11
  • php中實現(xiàn)xml與mysql數(shù)據(jù)相互轉(zhuǎn)換的方法

    php中實現(xiàn)xml與mysql數(shù)據(jù)相互轉(zhuǎn)換的方法

    這篇文章主要介紹了php中實現(xiàn)xml與mysql數(shù)據(jù)相互轉(zhuǎn)換的方法,實例封裝了一個類文件,可實現(xiàn)XML與MySQL數(shù)據(jù)的相互轉(zhuǎn)換,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12

最新評論

阿拉尔市| 弋阳县| 赤壁市| 沙雅县| 新宁县| 磐石市| 连云港市| 江源县| 广宗县| 罗平县| 兴城市| 南城县| 夏津县| 甘孜县| 苍梧县| 海原县| 洛南县| 高阳县| 丰原市| 林芝县| 尼木县| 古蔺县| 资源县| 永清县| 秦安县| 保山市| 文成县| 辉南县| 平乐县| 确山县| 安达市| 崇左市| 大厂| 大姚县| 嘉祥县| 赞皇县| 宿迁市| 永新县| 凌云县| 鄂伦春自治旗| 衡南县|