php natsort内核函数浅析第1/2页
2015-01-24信息快讯网
今天发现了php有个自然排序的函数----natsort,第一次听说了原来还有一种叫做“自然排序”的算法,很好奇
官方手册(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文件中)。
php strnatcmp()函数的用法总结
php 数组排序 array_multisort与uasort的区别
WordPress判断用户是否登录的代码
用php的ob_start来生成静态页面的方法分析
PHP中for与foreach的区别分析
php下安装配置fckeditor编辑器的方法
php Smarty 字符比较代码
8个出色的WordPress SEO插件收集
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
array_multisort实现PHP多维数组排序示例讲解
php关于array_multisort多维数组排序的使用说明
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
smarty中先strip_tags过滤html标签后truncate截取文章运用
PHP类中Static方法效率测试代码
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
PHP 源代码分析 Zend HashTable详解第1/3页
php empty函数 使用说明
用PHP的ob_start() 控制您的浏览器cache
PHP form 表单传参明细研究
php at(@)符号的用法简介
php fckeditor 调用的函数
php ignore_user_abort与register_shutdown_function 使用方法
php array_map array_multisort 高效处理多维数组排序
PHP加速 eAccelerator配置和使用指南
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
PHP mb_convert_encoding 获取字符串编码类型实现代码
将数组写入txt文件 var_export
对squid中refresh_pattern的一些理解和建议
php Http_Template_IT类库进行模板替换