现在的位置: 首页 > 综合 > 正文

php内核函数natsort浅析

2014年01月18日 ⁄ 综合 ⁄ 共 4998字 ⁄ 字号 评论关闭

     今天发现了php有个自然排序的函数----natsort,第一次听说了原来还有一种叫做“自然排序”的算法,很好奇,官方手册(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文件中)。

 

 

从strnatcmp_ex函数中的:

 

所以,我觉得应该字符串(当前位置开始)中前面的空字符和数字前面的‘0’不会参与比较,比较的结果应该和

http://us.php.net/manual/en/function.natsort.php

http://sourcefrog.net/projects/natsort/example-out.txt

 

所说的一样,但是在我的php5.2.9中对于“0”的处理结果却不一样(例如“img002.png”与“img1.png”,我的理解应该是前者大于后者,不过在我的5.2.9中却是前者小于后者),原因还没想清楚,可能是5.2.9的一个bug,也可能是自己还没有理解清楚源码的意思。下次配置好环境再好好测试,好好消化~~

 

 

 

在array.c中有两个重要的数据结构很值得我们关注:

Bucket:  http://www.phpchina.cn/bbs/viewthread.php?tid=88505

zval:      http://www.laruence.com/2008/08/22/412.html

 

【上篇】
【下篇】

抱歉!评论已关闭.