登录  /  注册
首页 > php教程 > php手册 > 正文

php natsort内核函数浅析第1/2页

php中文网
发布: 2016-06-13 12:22:33
原创
1351人浏览过

官方手册(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文件中)。
智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号