PHP自带排序函数和四种排序算法

废话

PHP的自带函数真是太强大了,不只是什么都有,还都是拿C写的效率绝对可以。可能这就是函数式编程的优势吧,我目前的水平也就在函数式编程这个层面了,面向对象刚刚入门!勿喷,喷请轻喷。PHP是世界上最好的语言,没有之一!

不废话,说说我的遭遇吧,本人算法水平很菜,需要实现一个无序数组的有序排列。于是写了半天的排序算法总算是写好了(冒泡)。为了看看人家的排序算法的写法就去百度了一下,搜到了PHP最常见的四种排序算法(冒泡、选择、插入、快速),然后莫名其妙的又搜到了一个PHP自带的排序函数,于是我就对这五种方法进行了测试,对执行效率进行排序。

发现PHP自带的函数执行速度都快要超过用PHP写的代码速度的一倍了,真是太厉害,我都不知道我应该崇拜PHP还是崇拜C语言了,但是这两种我都是会学的,PHP是我的第一门语言,先学好他,最终还是要学C的,用C写出一大堆PHP扩展来用,想一想这画面太美好。不过说回来,将来还是要面向对象的。

//执行速度
sort() < 快速 < 插入 < 选择 < 冒泡

看来我自己写的冒泡算法是最慢的,PHP自带的函数效率是最快的。

代码

下面是四种算法,在PHP自带函数的面前,感觉没啥用了...

利用CURL发送图片 做一个图片存储API

需求

工作的重要性除了吃饱饭,还有一个好处,就是在实际的场景下寻求解决问题的方法。不是那种模拟题预设好答案。

这次遇到这样一个新问题,要专门做一台服务器用来存储图片文件,而且这台服务器有PHP环境,希望这台服务器提供一个图片存储API接口,我们只需要在其他地方将图片发送到这个API接口,就可以将这张图片存储到这台服务器,而去API接口可以返回存储的路径和文件名。然后就是开始求代码了!

分析

碰到上面的问题,我一开始的想法就是图片上传POST到这台图片存储服务器上的API不就好了,但是又遇到一个问题,那就是上传图片的同时如果需要发送其他数据,多个POST地址是不利于后期维护的,而去不符合图片服务器API设计初衷。

于是那个神奇的CURL又一次出现在脑海里,对可以使用CURL来作为中间转发图片数据,然后用API接口接收。就这样,动手实现这个功能。

解决

我这里先在项目中的公共函数库里面添加了CURL模拟POST上传图片的函数如下:

PHP带参数POST跳转

需求

我先来描述下需求:a.html页面是一个form表单,用户填写资料后点击提交,将填写的数据提交到b.php页面,b.php页面接收到数据后进行相关处理,处理之后跳转到c.php页面,在跳转到c.php页面的时候用POST方式同步带上参数。
现在就是b.php页面不知道怎么写,让跳转的时候带上POST数据。

求助

首先各种百度,然后得到了大致三种方法:

CURL

这种方法是使用CURL模拟POST请求,但是页面不会跳转,如果加上header()跳转来到c.php的时候,因为CURL和header()跳转是异步的,所以c.php没办法把这些POST过来的数据和本次b.php跳转关联。于是这种方法没办法实现需求。

SESSION & COOKIE

这种方法就是在b.php页面把需要传输的数据存储到session或者cookie里面,跳转到c.php页面的时候,再从session或cookie里面读取出来,如果b.php和c.php不是一台服务器,那么session就没办法实现,但是存储在cookie中不够安全,于是这种方法也被我抛弃!


json_decode() 难住了 ThinkPHP

起因现象

做项目的一个手机验证码发送功能,为了优化用户输入的准确度,我将随机生成的四数字验证码在同时发送给用户的时候存储到redis种一份,并设置有效期300秒,如果当用户未收到验证码再次获取验证码的时候,我会先从redis种读取,如果redis种有,直接发送redis中的,确保短信通知延迟到达或者多条到达时候的用户判断效率。

项目这快用的是ThinkPHP开发,而且通过ThinkPHP的S()方法可以很便捷的实现这个功能。然后问题就出现了,在一次测试过程中,我先是收到了一条验证码是“0327”的,再次获取验证码的时候收到的是“327”,前面的“0”不见了。通过多次测试,确定了这个bug,如果随机生成的验证码是0开头的,那么再次获取的验证码就会把头部的0全部去掉。

问题分析

虽说不是什么致命性bug,但是作为程序员,我还是要解决的。先分析一下是哪里出了问题:

PHP数据类型?

第一想法是,是不是因为随时生成出来的是一个四数字,PHP是不是把这个四数字用int型存储,因为int型前面加再多0都会被PHP当作空或者转换成8进制。于是我就用了三种方法将生成出来的四数字转换成string型。