php natsort內(nèi)核函數(shù)淺析第1/2頁(yè)
官方手冊(cè)(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.
據(jù)官方手冊(cè)還可以得到這樣的結(jié)果:
img1.png img2.png img10.png img12.png
顯然這很適合對(duì)類(lèi)似文件名的排序。從結(jié)果看這種自然算法應(yīng)該是去掉頭和尾的非數(shù)字部分,然后對(duì)留下來(lái)的數(shù)字部分進(jìn)行排序,究竟是不是,還是看一下php源碼吧。
//從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)核代碼,不過(guò)憑借多年看代碼的經(jīng)驗(yàn),還是很容易找到這個(gè)自然排序算法的核心就是函數(shù):strnatcmp_ex(位于ext/standard/strnatcmp.c文件中)。
- php in_array 函數(shù)使用說(shuō)明與in_array需要注意的地方說(shuō)明
- PHP數(shù)組的交集array_intersect(),array_intersect_assoc(),array_inter_key()函數(shù)的小問(wèn)題
- php array_intersect比array_diff快(附詳細(xì)的使用說(shuō)明)
- PHP內(nèi)核介紹及擴(kuò)展開(kāi)發(fā)指南—基礎(chǔ)知識(shí)
- php數(shù)組函數(shù)序列之in_array() 查找數(shù)組值是否存在
- php數(shù)組函數(shù)序列之a(chǎn)rray_combine() - 數(shù)組合并函數(shù)使用說(shuō)明
- php數(shù)組函數(shù)序列之in_array() - 查找數(shù)組中是否存在指定值
- php數(shù)組函數(shù)序列之a(chǎn)rray_intersect() 返回兩個(gè)或多個(gè)數(shù)組的交集數(shù)組
- 使用js判斷數(shù)組中是否包含某一元素(類(lèi)似于php中的in_array())
- PHP內(nèi)核探索:變量存儲(chǔ)與類(lèi)型使用說(shuō)明
- PHP內(nèi)核探索:變量概述
- php內(nèi)核解析:PHP中的哈希表
- 2個(gè)自定義的PHP in_array 函數(shù),解決大量數(shù)據(jù)判斷in_array的效率問(wèn)題
- php數(shù)組查找函數(shù)in_array()、array_search()、array_key_exists()使用實(shí)例
- PHP函數(shù)in_array()使用詳解
- php提示W(wǎng)arning:mysql_fetch_array() expects的解決方法
- PHP內(nèi)核探索:哈希表碰撞攻擊原理
- 深入理解PHP內(nèi)核(一)
- 深入理解PHP內(nèi)核(二)之SAPI探究
- 深入php內(nèi)核之php in array
相關(guān)文章
PHP超級(jí)全局變量【$GLOBALS,$_SERVER,$_REQUEST等】用法實(shí)例分析
這篇文章主要介紹了PHP超級(jí)全局變量用法,結(jié)合實(shí)例形式分析了PHP中$GLOBALS,$_SERVER,$_REQUEST等超級(jí)全局變量相關(guān)概念、功能、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-12-12PHP動(dòng)態(tài)創(chuàng)建Web站點(diǎn)的方法
在這一篇中我寫(xiě)了一些動(dòng)態(tài)創(chuàng)建Web站點(diǎn)的一些內(nèi)容,例如黏性表單、發(fā)送電子郵件、日期函數(shù)等。希望能對(duì)大家有所幫助,別忘了好評(píng)哦。2011-08-08PHP實(shí)現(xiàn)的下載遠(yuǎn)程文件類(lèi)定義與用法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的下載遠(yuǎn)程文件類(lèi)定義與用法,結(jié)合具體實(shí)例形式分析了php封裝的下載遠(yuǎn)程文件操作類(lèi)定義及使用方法,需要的朋友可以參考下2017-07-07php快速查找數(shù)據(jù)庫(kù)中惡意代碼的方法
這篇文章主要介紹了php快速查找數(shù)據(jù)庫(kù)中惡意代碼的方法,可實(shí)現(xiàn)針對(duì)特殊字符的過(guò)濾功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04php獲取網(wǎng)頁(yè)標(biāo)題和內(nèi)容函數(shù)(不包含html標(biāo)簽)
有時(shí)候我們需要獲取網(wǎng)頁(yè)的標(biāo)題與內(nèi)容,就是個(gè)采集函數(shù),這里簡(jiǎn)單分享下,方便需要的朋友2014-02-02PHP+MySQL統(tǒng)計(jì)該庫(kù)中每個(gè)表的記錄數(shù)并按遞減順序排列的方法
這篇文章主要介紹了PHP+MySQL統(tǒng)計(jì)該庫(kù)中每個(gè)表的記錄數(shù)并按遞減順序排列的方法,涉及PHP基于PDO操作MySQL數(shù)據(jù)庫(kù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02PHP類(lèi)的靜態(tài)(static)方法和靜態(tài)(static)變量使用介紹
PHP類(lèi)的靜態(tài)(static)方法和靜態(tài)(static)變量使用介紹,學(xué)習(xí)php的朋友可以看下2012-02-02