PHP面试题大全
1、__FILE__表示什么意思?
文件的完整路径和文件名 __FILE__ 获取当前执行的PHP脚本 例如:www/app/index.php
2、__DIR__表示什么意思?
当前脚本所在目录 例如:www/app/
3、如何获取服务端和客户端的IP地址?
客户端:$_SERVER[‘REMOTE_ADDR’]
服务端:$_SERVER[‘SERVER_ADDR’]
4、写出使用header函数跳转页面的语句
header('location:login.php');
5、$str是一段html文本,使用正则表达式去除其中的所有js脚本?
$pattern = '/<script.*>\.+</script>/',
preg_replace($pathern,$str);
6、写出将一个数组里的空值去掉的语句?
<?php
$arr = array('','',123,19);
print_r(array_filter($arr,'del'));//array_filter()函数说明:依次将 $arr 数组中的每个值传递到 del 函数中
function del($d){
return trim($d);
}
?>
7、写出获取当前时间戳的函数,及打印前一天的时间的方法(格式:年-月-日 时:分:秒)?
time();
data("Y-m-d H:i:s",strtotime("-1 day"));
8、MYSQL取得当前时间的函数是?,格式化日期的函数是?
获取系统日期: NOW()函数返回当前的日期和时间。// 2008-12-29 16:25:46
格式化日期: DATE_FORMAT(date, format) 函数用于以不同的格式显示日期/时间数据。// 例如:DATE_FORMAT(NOW(),'%Y-%m-%d')
9、写出php进行编码转换的函数?
iconv('gb2312','utf-8'//IGNORE,$str);//把gb2312转换成utf-8
10、$str = “1,3,5,7,9,10,20”,使用什么函数可以把字符串str转化为包含各个数字的数组??
$arr = explode(',',$str);
11、serialize() /unserialize()函数的作用?
resrialize();//序列化数据,返回一个可存储的字符串
unserialize();//反序列化数据,返回一个数组
12、写出一个函数,参数为年份和月份,输出结果为指定月的天数?
1 <?php
2 function day_count($year,$month){
3 return date('t',strtotime($year.'-'.$month.'-1'));
4 }
5 echo day_count(1989,2);
13、一个文件的路径为/wwwroot/include/page.class.php,写出获得该文件扩展名的方法?
1 <?php
2 $str = '/wwwroot/include/page.class.php';
3 $arr = pathinfo($str);
4 $str = '.' . $arr['extension'];
5 echo $str;
14、本地mysql数据库db_test里已建有表friend,数据库的连接用户为root,密码为123,friend表字段为:id,name,age,gender,phone,email 请使用php连接mysql,选择出friend表里age > 20的所有记录打印结果,并统计出查询出的结果总数。
1 <?php
2 $link = mysql_connect("localhost","root","123") or die("数据库连接失败!");
3 mysql_select_db('db_test',$link) or die("选择数据库失败!");
4 $sql = "SELECT * FROM friend WHERE age > 20";
5 $res = mysql_query($sql);
6 if($res){
7 $count = mysql_num_rows($res);
8 where($row = mysql_fetch_assoc($res)){
9 print_r($row);
10 }
11 echo "结果总数:" . $count;
12 }
13
15、以下有两个表
user表 字段id (int),name (varchar)
score表 字段uid (int),subject (varchar) ,score (int)
score表的uid字段与user表的id字段关联
要求写出以下的sql语句
1)在user表里新插入一条记录,在score表里插入与新加入的记录关联的两条记录
2)获取score表里uid为2的用户score最高的5条记录
3)使用联合查询获取name为“张三”的用户的总分数
4)删除name为“李四”的用户,包括分数记录
5)清空score表
6)删除user表
1、
1 mysql_query('INSERT INTO user(name) values("zhang3")');
2 $id = mysql_insert_id();
3 mysql_query('INSERT INTO score(uid,subject,score) values('.$id.',"english","89")');
2、
1 $sql = "SELECT uid,subject,score FROM score WHERE uid = 2 ORDER By score DESC LIMIT 0,5";
3、
1 $sql = "SELECT sum(score) FROM score s RIGHT JOIN user u ON u.id = s.uid WHERE u.name = '张三'";
4、
1 $sql1 = "DELETE FROM score WHERE uid IN(SELECT id FROM user WHERE name='李四')";
2 $sql2 = "DELETE FROM user WHERE name='李四'";
5、
1 $sql = "delete from score";
6、
1 $sql = "DROP TABLE user";
15、简述mysql水平分表和垂直分表是什么,他们的使用场景和优缺点?
垂直分表:把PK和一些列放到一个表,然后把PK和另外的列放到另一个表中,关联PK。
使用原因:
1、减少字段可使内存加载更多行数据,有利于查询。
2、受限于操作系统中的文件大小限制。
切分原则:
1、把不常用、业务逻辑不紧密、存储内容比较多的字段,分到新的表中可使表存储更多数据。
优点:使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。
缺点:需要管理冗余列,查询所有数据需要join操作。
水平分表:根据一列或多列数据的值把数据行放到两个独立的表中。
使用原因:
1、随着数据量的增大,数据表中的行数越来越大,查询的效率越来越低。水平分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
2、同样受限于操作系统中的文件大小限制,数据量不能无限增加,当到达一定容量时,需要水平切分以降低单表的大小。
切分原则:
1、需要把一张大表里的数据分散存放到多个表中
优点:降低在查询时需要读的数据和索引的页数,提高查询速度。
缺点:给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作,使join操作变的困难。
16、实现中文字串截取无乱码的方法
方法一:
1 <?php 2 $str = 'hi,你好世界hello world!';//中文默认是3个字符 3 echo My_substr($str,0,9); 4 function My_substr($string, $start, $length) { 5 if(strlen($string)>$length){ 6 $str=null; 7 $len=$start+$length; 8 for($i=$start;$i<$len;$i++){ 9 if(ord(substr($string,$i,1))>0xa0){ 10 $str.=substr($string,$i,2); 11 $i++; 12 }else{ 13 $str.=substr($string,$i,1); 14 } 15 } 16 return $str; 17 }else{ 18 return $string; 19 } 20 }
结果:hi,你好 //hi,是3个,你好是6个 共9个
方法二:
1 <?php
2 $str = 'hi,你好世界hello world!';//一个字母或中文或标点符号是一个字符
3 echo mb_substr($str,0,9,'utf-8');//需要php.ini 开启php_mbstring.dll
结果:hi,你好世界he //9个
17、表单中 get与post提交方法的区别?
get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息
GET安全性比较差 POST安全性比较好
GET传输数据较小 POST传输数据较多
18、GET方式,POST方式传值的最大长度是多少?
post 理论上讲是没有大小限制的,HTTP协议规范也没有进行大小限制,但实际上post所能传递的数据量大小取决于服务器的设置和内存大小。因为我们一般 post的数据量很少超过MB的,所以我们很少能感觉的到post的数据量限制,但实际中如果你上传文件的过程中可能会发现这样一个问题,即上传个头比较 大的文件到服务器时候,可能上传不上去,以php语言来说,查原因的时候你也许会看到有说PHP上传文件涉及到的参数php默认的上传有限定,一般这个值是2MB,更改这个值需要更改php.conf的post_max_size这个值。这就很明白的说明了这个问题了。
19、session与cookie的区别?
session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放,相对比较安全
cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的,不安全。
20、解释一下PHP的类中:protect,public,private,interface,abstract,final,static的含义
Protect 受保护的 可以被子类继承,不能再外部调用
Public 公开的 可以继承,可以在外部调用
Private 私有的 不可以继承,不可以在外部条用
Interface 接口
Abstract 抽象类
Final 定义的方法不能被继承
Static 静态的
21、写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名例如: http://www.test.com.cn/abc/de/fg.php?id=1需要取出php或.php
1 <?php
2 $url = 'http://www.test.com.cn/abc/de/fg.php?id=1';
3 echo Get_extension($url);
4 function Get_extension($url){
5 $arr = parse_url($url);
6 $patharr = pathinfo($arr['path']);
7 $extension = $patharr['extension'];
8 Return $extension;
9 }
22、解释:MVC
由模型(model),视图(view),控制器(controller)完成的应用程序
由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
22、描述一下大流量高并发量网站的解决方案
优化SQL语句
使用缓存技术 memcache redis
分库分表
主从复制
22、如何设计或配置Mysql,才能达到高效使用的目的?
使用索引 使用外键 使用事务
1、数据库设计方面,设计结构良好的数据库,允许部分数据冗余。选取最适用的字段属性,尽可能把字段设置为NOTNULL,这样在查询的时候,数据库不用去比较NULL值。
2、系统架构设计方面,表散列,把海量数据散列到几个不同的表里面,集群,数据库查询和写入分开。
22、用PHP写出一个安全的用户登录系统需要注意哪些方
使用form表单,使用ajax验证密码和用户名。
22、echo(),print(),print_r()的区别
echo是PHP语句,语句没有返回值,
print和print_r是函数,函数可以有返回值(即便没有用)
print() 只能打印出简单类型变量的值(如int,string)
print_r() 可以打印出复杂类型变量的值(如数组,对象)
echo 输出一个或者多个字符串
22、优化MYSQL数据库的方法
1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM
2、使用连接(JOIN)来代替子查询
3、使用联合(UNION)来代替手动创建的临时表
4、事务处理
5、锁定表,优化事务处理
6、建立索引
7、优化查询语句
23、语句include和require的区别是什么?为避免多次包含同一文件,可用什么语句代替它们?
1、require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
2、include有返回值,而require没有
3、包含文件不存在或者语法错误的时候require是致命的,include不是
include_once(); require_once();
24、如何修改SESSION的生存时间?
方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
方法2:$savePath = "./session_save_dir/";
$lifeTime = 小时 * 秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
方法3:setcookie() and session_set_cookie_params($lifeTime);
25、有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?
echo file_get_contents("http://www.phpres.com/index.html");
26、写出发贴数最多的十个人名字的SQL,利用下表:members(id,username,posts,pass,email)
SELECT * FROM `members` ORDER BY posts DESC limit 0,10;
27、请写一个函数验证电子邮件的格式是否正确
1 <?php
2 $email = 'm125654564@163.com';
3 echo check_email($email);
4 function check_email($email){
5 $pregemail = "/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/";
6 return preg_match($pregemail,$email);
7 }
28、如何得到当前执行脚本路径,包括所得到参数。
basename(__file__);
print_r($script_name);
29、JS表单弹出对话框函数是?获得输入焦点函数是?
弹出对话框: alert(),prompt(),confirm();
获得输入焦点 focus();
30、取得查询结果集总数的函数是?
mysql_num_rows($result);
31、请写出PHP5权限控制修饰符
public(公共),private(私用),protected(继承)
32、请写出php5的构造函数和析构函数
__construct() , __destruct()
33、写出你认为语言中的高级函数
array_pop():弹出数组的最后一个元素
explode():按特点符号,分隔字符串,返回数组
implode();按特点符号,连接数组成为字符串
substr();取出字符串中的一部分
strrpos();获得字符出现的最后的位置
34、简述Cookie的设置及获取过程
设置cookie setCookie('名字','值',时间,'位置');
获取cookie COOKIE['名字'];
例如:
setCookie('user_name','zhangsan',time()+3600);
$user_name = $_COOKIE['user_name'];
echo $user_bane;
35、面向对象中接口和抽象类的区别及应用场景
抽象类:关键字abstract
1.定义一些方法,子类必须完全实现这个抽象中所有的方法
2.不能从抽象类创建对象,它的意义在于被扩展
3.抽象类通常具有抽象方法,方法中没有大括号
4.抽象方法不必实现具体的功能,由子类来完成
5.在子类实现抽象类的方法时,其子类的可见性必须大于或等于抽象方法的定义
6.抽象类的方法可以有参数,也可以为空
7.如果抽象方法有参数,那么子类的实现也必须有相同的参数个数
接口:关键字interface
1.如果要使用接口,必须定义接口类中的所以方法少一个都不可以(abstract除外)。
2.这样如果在一个大项目中不管别人怎么去做下面的方法,但是他必须实现本接口中的所有方法才可以!
36、MySQL存储引擎中MyISAM和InnoDB,在同样的应用场景中各有什么优缺点,索引结构如何实现
1、在增、删、改和查方面,myisam要优于innodb表引擎,当数据量特别大时,他们的速度相差不大
2、innodb支持myisam所不具备的事务支持、存储过程,行级锁定
37、请用任何一种语言写出一个函数,能够遍历一个文件夹下的所有文件及文件夹
1 <?php
2 function my_scandir($dir){
3 $files = array();
4 if($handle = opendir($dir)){
5 while(($file = readdir($handle)) !== false ) {
6 if($file != ".." && $file != "." ){
7 if(is_dir($dir . "/" . $file)){
8 $files[$file] = scandir($dir . "/" . $file);
9 }else {
10 $files[] = $file;
11 }
12 }
13 }
14 closedir($handle);
15 return $files;
16 }
17 }
38、echo count('abcd');输出多少?
结果:1 //count() 函数返回数组中元素的数目。
39、linux下终止一个进程用什么命令?打包压缩和解包用什么命令?
pkill -9 进程名或kill 进程号、tar zcvf和tar zxvf
40、什么是魔术方法?请列举你知道的4-6个
__construct();//类的构造函数,当类被创建的时候调用。
__destruct();//类的析构函数,当类被销毁时被调用。
__set($name,$value);//当程序试图写入一个不存在或者不可见的成员变量时,PHP就会执行__set()方法。
__get($name);//当程序试图调用一个未定义或不可见的成员变量时,可以通过__get()方法来读取变量值。
__call();//在对象中调用一个不可访问方法时会调用。
__sleep();//当对象被序列化后会被调用,并允许你处理序列化。
__wakeup();//当更改对象解序列化的行为时被调用。
__clone();//当对象复制完成时调用.
__toString();//当对象当成字符串时的回应方法。
41、使用什么函数可以重定向跳转页面?
PHP中的header("location:url");
JS中的 window.location="url";
42、什么是xxs攻击,和sql攻击,怎么防御?
xxs攻击:xss表示Cross Site Scripting(跨站脚本攻击),通过插入恶意脚本,实现对用户游览器的控制
解决办法:
1 /*
2 过滤用户代码
3 */
4 function security($str){
5 $str = trim($str); //清理空格
6 $str = strip_tags($str); //过滤html标签
7 $str = htmlspecialchars($str); //将字符内容转化为html实体
8 $str = addslashes($str);//函数返回在预定义字符之前添加反斜杠的字符串
9 return $str;
10 }
sql注入攻击:SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的
解决办法:
使用PDO对象(对于任何数据库驱动都好用);
43、php有几种数据类型?分别是什么?
八种数据类型:整型,浮点型,字符串,布尔型,数组,对象,资源,NULL
44、数据库中的事务是什么?
事务是数据库的一种数据结构类型
执行环境:当执行一堆数据库语句操作(多为增删改操作)并且所有语句都能执行才将sql语句都执行,否则返回到数据库未做修改时的状态(称为回滚)
使用环境:一般使用在对金额的数据库操作时使用
45、写一个自定义函数,翻转包含中文的字符串
1 <?php
2 function str_rev($str){
3 //判断输入的是不是utf8类型的字符,否则退出
4 if(!is_string($str)||!mb_check_encoding($str,'UTF-8')){
5 exit("输入类型不是UTF8类型的字符串");
6 }
7 $s = '';
8 $len = mb_strlen($str,'utf-8');//确保php.ini中开启php_mbstring.dll
9 for($i = $len; $i >= 0; $i--){
10 $s .=mb_substr($str,$i,1,'utf-8');
11 }
12 return $s;
13 }
14 $str = '这是一段话abc';
15 echo str_rev($str);
46、在开发项目中,需要上传超过8M的文件,请说明在php.ini需要修改的配置项。
post_max_size=2M(默认)
Upload_max_filesize=8M(默认)
47、写出session的运行机制,session与cookie的区别。多台WEB服务器如何共享session。
session的运行机制:
用户A访问站点Y,如果站点Y指定了session_start();(以下假设session_start()总是存在)那么会产生一个session_id,这个session_id一般会以COOKIE的形式保存到用户A(我们可以通过在php.ini里设置session.use_only_cookies为1,强制SESSIONID必须以COOKIE专递。)。这时候SESSION ID表现为$_COOKIE['PHPSESSID'];(PHPSESSID可用session_name()函数来下修改)
用户A接着访问,这个session id($_COOKID[‘PHPSESSID’])就会在A每次访问Y的时候传送到站点Y。
在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到session id,然后通过session id,来获得与SESSION数据的关联,并返回SESSION数据。
session与cookie的区别:
SESSION存储在服务器端,用户无法进行修改,相对比较安全,COOKIE存储在客户端,用户通过手段可以进行修改,相对不安全。
Session会在一定时间内保存在服务器上,当访问增多,会比较占用服务器资源。
单个cookie在客户端的限制是3k,就是说一个站点在客户端存放的COOKIE不能超过3k。
多台服务器如何共享SESSION:
共享就是每台服务器公用一个,那显然要把这个session专门放到一个地方
比如存数据库,每台服务器都调这个数据库里的session
48、请写一个函数,实现以下功能:字符串'open_door' 转换成'OpenDoor'、'make_by_id' 转换成 'MakeById'
1 <?php
2 function str_change($str){
3 $arr = explode('_',$str);
4 foreach($arr as $k => $v){
5 $arr[$k] = ucwords($v);
6 }
7 return implode($arr);
8 }
9 $str = 'open_door';
10 echo str_change($str);
49、如何取得某个程序中, 第n 行到第m行之间的程序片段 的执行时间
microtime(true);
50、您所知道的MYSQL 数据库备份,还原方式有哪几种?
备份:
1、搭建主从架构,master-slave,通过binlog文件同步复制主库的数据,也可以直接通过binlog文件恢复数据。
2、通过系统计划任务执行mysqldump做周期性全备份。
3、物理备份,直接拷贝数据文件、参数文件、日志文件。
还原:
1、通过mysql操作工具,如phpmyadmin,sqlyog等导入备份过的数据库文件。
2、将物理备份的文件拷贝到mysql的data目录下
51、我们为什么要雇请你呢?
话虽简单,可是难度颇高。主要是测试你的沉静与自信。给一个简短、有礼貌的回答:"我能做好我要做得事情,我相信自己,我想得到这份工作"。根据自己的实际情况,好好想想把,看怎么说才具有最高说服力。
52、你对加班有什么看法?
这是针对"工作热忱"而问的,当然无理的加班不一定就是好的,最好回答"在自己责任范围内,不能算是加班"较有利。总之,尽量诚实回答,如果你说了"是"而实际上却不想,那么你会被人一直盯住。
53、用PHP写一段代码,实现不使用第3个变量,交换$a,$b的值,$a,$b的初始值自己定。
1 <?php
2 $a='look';
3 $b=10;
4 echo '原始:'.$a.$b.'<br>';
5 list($a,$b) = array($b,$a);
6 echo '交换后:'.$a.$b;
7 //结果:
8 原始:look10
9 交换后:10look
54、要求使用jQuery事件写在页面元素加载完成之后,动态绑定click事件到btnOK元素
1 <input id="btnOK" type="button" />
2 //加载jQuery文件略
3 <script type='text/javascript'>
4 $(function(){
5 $('#btnOK').bind('click',function(){
6 //点击事件执行函数
7 })
8 })
9 </script>
55、怎样防止图片防盗连接?
1、你可以把真实的图片做为背景图片,而使用一张透明图片匹配尺寸并覆盖到真实图片上面。
1 <div id="image1" style="background-image: url(originalImage.jpg);">
2 <img src="blank.gif" height="250px" width="300px">
3 </div>
2、图片加上水印
3、使用flash显示图片
56、禁用COOKIE后SESSION是否可用,为什么?
可以,但是需要在传值的时候将Session_id写到URL中;因为禁用以后再传递参数的时候会以网址的形式参数接到后面传过去!
57、memcache的缓存原理
Memcache通过hash表的键值对的方式存储数据在内存中,有效的解决了服务器中的I/O和数据库开销,作为服务器缓存的首要选择,memcache适用于分布式环境,对于LVS环境起到至关重要的作用。
58、memcache和redis区别?
1、redis与 memcached相比,redis支持key-value数据类型,支持list、set、hash等数据结构的存储
2、redis支持数据的备份,即master-slave模式的数据备份
3、redis支持数据的持久化
4、redis在很多方面支持数据库的特性,可以这样说他就是一个数据库系统,而memcached只是简单地K/V缓存
5、它们在性能方面差别不是很大,读取方面尤其是针对批量读取性能方面memcached占据优势。当然redis也有他的优点,如持久性、支持更多的数据结构
6、所以在选择方面如果有持久方面的需求或对数据类型和处理有要求的应该选择redis
7、如果简单的key/value 存储应该选择memcached
PHP 排序比较:
<?php //快速排序法 function quick_sort($arr) { $length = count($arr); if ($length <= 1) { return $arr; } $mid = $arr[0]; $left_array = []; $right_array = []; for ($i = 1; $i < $length; $i++) { if ($mid > $arr[$i]) { $left_array[] = $arr[$i]; } else { $right_array[] = $arr[$i]; } } $left_array = quick_sort($left_array); $right_array = quick_sort($right_array); return array_merge($left_array, [$mid], $right_array); } //冒泡排序法 function bubble_sort($arr) { $len = count($arr); //设置一个空数组 用来接收冒出来的泡 //该层循环控制 需要冒泡的轮数 for ($i = 1; $i < $len; $i++) { //该层循环用来控制每轮 冒出一个数 需要比较的次数 for ($k = 0; $k < $len - $i; $k++) { if ($arr[$k] > $arr[$k + 1]) { $tmp = $arr[$k + 1]; $arr[$k + 1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; } //选择排序 function select_sort($arr) { //实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数 //$i 当前最小值的位置, 需要参与比较的元素 for ($i = 0, $len = count($arr); $i < $len - 1; $i++) { //先假设最小的值的位置 $p = $i; //$j 当前都需要和哪些元素比较,$i 后边的。 for ($j = $i + 1; $j < $len; $j++) { //$arr[$p] 是 当前已知的最小值 if ($arr[$p] > $arr[$j]) { //比较,发现更小的,记录下最小值的位置;并且在下次比较时, // 应该采用已知的最小值进行比较。 $p = $j; } } //已经确定了当前的最小值的位置,保存到$p中。 //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可 if ($p != $i) { $tmp = $arr[$p]; $arr[$p] = $arr[$i]; $arr[$i] = $tmp; } } //返回最终结果 return $arr; } //插入排序 function insert_sort($arr) { //区分 哪部分是已经排序好的 //哪部分是没有排序的 //找到其中一个需要排序的元素 //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素 //利用循环就可以标志出来 //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了, //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列 for ($i = 1, $len = count($arr); $i < $len; $i++) { //获得当前需要比较的元素值。 $tmp = $arr[$i]; //内层循环控制 比较 并 插入 for ($j = $i - 1; $j >= 0; $j--) { //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素 if ($tmp < $arr[$j]) { //发现插入的元素要小,交换位置 //将后边的元素与前面的元素互换 $arr[$j + 1] = $arr[$j]; //将前面的数设置为 当前需要交换的数 $arr[$j] = $tmp; } else { //如果碰到不需要移动的元素 //由于是已经排序好是数组,则前面的就不需要再次比较了。 break; } } } //将这个元素 插入到已经排序好的序列内。 //返回 return $arr; } //生成一个数组 function rand_arr($num) { $arr = []; for ($i = 0; $i < $num; $i++) { $arr[$i] = rand(0, $num); } return $arr; } function mtime() { $mtime = explode(' ', microtime()); $time = $mtime[1] + $mtime[0]; return $time; } $num = 8000; $input = rand_arr($num); $quick_start = mtime(); $quick_sort = implode(',', quick_sort($input)); $quick_end = mtime(); $quick_time = $quick_end - $quick_start; $bubble_start = mtime(); $bubble_sort = implode(',', bubble_sort($input)); $bubble_end = mtime(); $bubble_time = $bubble_end - $bubble_start; $select_start = mtime(); $select_sort = implode(',', select_sort($input)); $select_end = mtime(); $select_time = $select_end - $select_start; $insert_start = mtime(); $insert_sort = implode(',', insert_sort($input)); $insert_end = mtime(); $insert_time = $insert_end - $insert_start; echo "原始数组长度:[{$num}] <br/>"; echo "快速排序耗时:{$quick_time}微妙<br/>"; echo "冒泡排序耗时:{$bubble_time}微妙<br/>"; echo "选择排序耗时:{$select_time}微妙<br/>"; echo "选择排序耗时:{$insert_time}微妙<br/>";
结果: