php natsort内核函数浅析第1/2页
2018-10-12 14:08
525 查看
官方手册(http://us.php.net/manual/en/function.natsort.php)
据官方手册还可以得到这样的结果:
img1.png img2.png img10.png img12.png
显然这很适合对类似文件名的排序。从结果看这种自然算法应该是去掉头和尾的非数字部分,然后对留下来的数字部分进行排序,究竟是不是,还是看一下php源码吧。
虽然是第一次查看php的内核代码,不过凭借多年看代码的经验,还是很容易找到这个自然排序算法的核心就是函数:strnatcmp_ex(位于ext/standard/strnatcmp.c文件中)。
12下一页阅读全文
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文件中)。
12下一页阅读全文
您可能感兴趣的文章:
- php in_array 函数使用说明与in_array需要注意的地方说明
- PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
- php array_intersect比array_diff快(附详细的使用说明)
- PHP内核介绍及扩展开发指南―基础知识
- php数组函数序列之in_array() 查找数组值是否存在
- php数组函数序列之array_combine() - 数组合并函数使用说明
- php数组函数序列之in_array() - 查找数组中是否存在指定值
- php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
- 使用js判断数组中是否包含某一元素(类似于php中的in_array())
- PHP内核探索:变量存储与类型使用说明
- PHP内核探索:变量概述
- php内核解析:PHP中的哈希表
- 2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
- php数组查找函数in_array()、array_search()、array_key_exists()使用实例
- PHP函数in_array()使用详解
- php提示Warning:mysql_fetch_array() expects的解决方法
- PHP内核探索:哈希表碰撞攻击原理
- 深入理解PHP内核(一)
- 深入理解PHP内核(二)之SAPI探究
- 深入php内核之php in array
相关文章推荐
- php natsort内核函数浅析第1/2页
- php内核函数natsort浅析
- 超级全面的PHP面试题整理集合第1/2页
- php IIS日志分析搜索引擎爬虫记录程序第1/2页
- 一个模仿oso的php论坛程序源码(之三)第1/2页
- php优化及高效提速问题的实现方法第1/2页
- PHP_MySQL教程-第二天while循环与数据库操作第1/2页
- PHP PDO函数库(PDO Functions)第1/2页
- PHP 面向对象改进后的一点说明第1/2页
- 浅析Javascript原型继承 推荐第1/2页
- Win2003下IIS+PHP+MySQL+Zend配置步骤详解第1/2页
- PHP单元测试利器 PHPUNIT深入用法(二)第1/2页
- PHP单元测试利器 PHPUNIT深入用法(二)第1/2页
- php计数器的设计与实现第1/2页
- [PHP]经常用到的实用函数集合第1/2页
- Php部分常见问题总结第1/2页
- Apache+php+mysql在windows下的安装与配置(图文)第1/2页