时间:2021-05-26
官方手册(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;
}
PHP_FUNCTION(natsort)
{
php_natsort(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}
虽然是第一次查看php的内核代码,不过凭借多年看代码的经验,还是很容易找到这个自然排序算法的核心就是函数:strnatcmp_ex(位于ext/standard/strnatcmp.c文件中)。
12下一页阅读全文
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一般我们插入页码,是从第1页面开始插入的。但是现在第1页面是目录,第2页面开始才是正文,所以我们想要从第2页面开始插入第1页的页码。软件名称:Word2016f
本文实例为大家分享了php微信公众号开发简答题的具体代码,供大家参考,具体内容如下简答题array("第5页第1个字"=>"王","第8页第1个字"=>"李",
1、安装VS.PHP插件2、新建PHP工程:如下图,选择PHP4webproject创建PHP工程。3、新建PHP页4、添加PHP代码5、设置起始页6、设置断点
一个同事做毕业论文,论文是Word格式,1-2页是封面和目录,不需要页码,第3-10页是论文内容,需要从第1页开始显示,并显示论文内容的总页数8页。具体为页脚处
word2007链接到前一条页眉的方法: 1、将光标放在第2页的首部,单击页面布,分隔符,分节符,下一节。 2、在第2页的页脚处双击鼠标,进入页脚编辑状态。