PHP面试题集锦0327
/**
* 第1题:用PHP打印出昨天的时间格式,如:"2017-03-26 14:42:09"
*/
date("Y-m-d H:i:s", strtotime("-1 day") );
/**
* 第2题:用PHP打印出上周的时间格式,如:"2017-03-20 14:42:09"
*/
date("Y-m-d H:i:s", strtotime("-1 week") );
/**
* 第3题:用PHP打印出上个月的时间格式,如:"2017-02-27 14:42:09"
*/
date("Y-m-d H:i:s", strtotime("-1 month") );
/**
* 第4题: 简述一下echo、print、print_r 区别
*/
print_r()主要用来输出数组的结构;echo 和 print 主要用来输出字符串,只不过echo 可同时输出多个字符串,print() 只能输出一个字符串;
echo 和 print() 区别:
(1)使用命令方式echo来输出字符串,此时不需要小括号; 看个人习惯,个人习惯使用echo方式来输出字符串
(2)使用函数方式print()来输出字符串,echo无返回值,print有返回值,成功返回 1,失败返回 0
/**
* 第5题:如何实现字符串反转,如:"abcdefg" 反转成 "gfedcba";
*/
调用php自带的strrev()函数
例如:
strrev("abcdefg");
/**
* 第6题: 如何实现中文字符串截取无乱码的方法
*/
mb_*系列函数,首先:需要开启 extension=php_mbstring.dll 扩展
mb_substr()
/**
* 第7题:用PHP写出获取客户端和服务器端IP的代码
*/
echo $_SERVER['REMOTE_ADDR']; //客户端IP echo $_SERVER['SERVER_ADDR']; //服务器端IP echo $_SERVER['PHP_SELF']; //结果:"/index.php" 当前脚本的名称(不包括路径和查询字符串) echo $_SERVER["HTTP_REFERER"]; //链接到当前页面的来源url echo gethostbyname("www.demo.com"); //获取指定域名的IP地址 echo getenv("REMOTE_ADDR"); //获取客户端IP地址 echo getenv("SERVER_ADDR"); //获取服务器端IP地址
/**
* 第8题:简述include与require的区别?
*/
相同点:
(1)include与require都能把另外一个文件包含到当前文件中
* 异同点:
(1)使用include时,当包含的文件不存在时系统会报出警告级别的错误,但并不影响程序的后续执行.
(2)使用require时,当包含的文件不存在时系统会先报出警告级别的错误,接着又报出一个致命性的错误,将终止程序的后续执行.
(3)require只会解释包含的文件一次,不会再解释第二次,因而效率相对较高;而include则会重复的解释包含的文件
(4)载入时机不同:require在运行前载入包含文件,include在运行时载入包含文件
/**
* 第9题:如何获取一个字符串中指定的字符?
*/
$str="abcdefg"; echo $str{2};
/**
* 第10题:如何批量替换字符串中的特定字符?如:"批量替换$content内容字符串中的所有双引号为单引号"
*/
$content = '他说:"你到底说了啥"?'; $content = str_replace( $searchs=array("\""), $replaces=array("'"), $content ); var_dump($content);
/**
* 第11题: 统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数
*/
$array=array(4,5,1,2,3,1,2,"a","a"); $ac=array_count_values($array); echo "<pre>";print_r($ac);
/**
* 输出结果:
* Array(
* [4] => 1
* [5] => 1
* [1] => 2
* [2] => 2
* [3] => 1
* [a] => 2
* )
*/
/**
* 第12题:如何统计字符串中每种字符的出现次数并排序?
*/
function countStr($str){ $str_array=str_split($str);//str_split()函数能将字符串中每个字符都转化为数组的元素 $str_array=array_count_values($str_array); arsort($str_array);//arsort()函数对数组进行逆向排序并保持索引关系 return $str_array; } $str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas"; echo "<pre>";print_r(countStr($str));
/**
* 输出结果:
* Array(
[$] => 7
[3] => 6
[*] => 6
[4] => 5
[f] => 5
[s] => 4
[d] => 4
[5] => 3
[a] => 3
[6] => 2
[2] => 2
[g] => 2
[#] => 2
)
*/
/**
* 第13题:str_word_count() 函数计算字符串中的单词数?
*/
/**
* 输出结果:
Array(
[0] => Hello
[1] => world
)
*/
echo "<pre>";print_r(str_word_count("Hello world!",1)); //参数二:1-返回包含字符串中的单词的数组
/**
* 输出结果:
Array(
[0] => Hello
[6] => world
)
*/
echo "<pre>";print_r(str_word_count("Hello world!",2)); //参数二:2-返回一个数组,其中的键是单词在字符串中的位置,值是实际的单词.
/**
* 第14题:redis与memcached区别?
*/
/**
* 不同点:
*
* (1)redis中并不是所有数据在有效期内只能常驻内存的(如果需要,可定期同步持久化到磁盘),这是和memcached相比一个最大的区别(memcached中的数据在有效期内是以键值对的形式常驻内存的)
* (2)redis不仅仅支持简单的键值对类型的数据,同时还提供list,set,hash等数据结构的存储;memcached仅支持简单的键值对类型的数据,但是memcached却可以缓存图片、视频等等数据
* (3)redis支持数据的备份,即master-slave模式的数据备份
* (4)redis支持数据的持久化和数据同步,可以将内存中的数据保存在磁盘中,重启系统后可以再次加载进行使用,缓存数据不会因此而丢失.memached缓存数据是常驻内存的,重启系统后数据就没了
* (5)redis可以通过expire设定有效期,memcached在set数据的时候可以指定要缓存的数据永不过期
* (6)redis可以做一主多从;memcached也可以做一主多从
* (7)redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘;memcached当物理内存用完后就会自动清理一些早期的数据
*
* 相同点:
*
* (1)redis和memcached都是将数据存放在内存中,都是内存数据库
* (2)redis和memcached都可以做一主多从
*
* 性能:
*
* (1)redis根据其官方的测试结果:在50个并发的情况下请求10w次,写的速度是110000次/s,读的速度是81000次/s
* (2)redis将键名与值的最大上限各自设定为512MB;memcached则<span id="transmark"></span>将键名限制在250字节,值也被限制在不超过1MB,且只适用于普通字符串.
*
* 何时使用memcached:
*
* (1)小型静态数据:当我们需要缓存小型静态数据的时候可以考虑memcached,最具代表性的例子就是HTML代码片段;因为memcached的内部内存管理机制虽然不像redis的那样复杂,但却更具实际效率,这是因为memcached在处理元数据时所消耗的内存资源相对更少.作为memcached所支持的惟一一种数据类型,字符串非常适合用于保存那些只需要进行读取操作的数据,因为字符串本身无需进行进一步处理<span id="transmark"></span>.
*/
/**
* 第15题: 将外网图片本地化、将外网图片下载到本地的原理
*/
copy("http://qn.yun.u8code.org/statics/images/ecshop-001.png",'new_file.jpg');
/**
* 第16题: 遍历函数: scandir()与 glob()函数的区别
*/
区别在于:遍历文件夹、遍历目录、遍历子文件夹、遍历子目录、遍历文件
/**
* 第17题: 如何在数组头部和尾部及任意位置插入元素?
*/
①array_unshift(); //在数组头部插入一个或多个元素 array_push(); //在数组尾部插入一个或多个元素 array_splice($arr,$start,0,$arr1); //在数组的第$start+1个位置插入新元素(指的是头部和中部任意位置,但不包括尾部),注意:参数3一定要是0 ②删除元素 array_shift(); //删除数组中首个元素,并返回删除后的值 array_pop(); //删除数组的最后一个元素(出栈),并返回删除后的值
/**
* 第18题: 如何将二位数组按某一个或多个字段值(升序/降序)排序?数字索引被重置,关联索引保持不变
*/
$arr=array( array('id'=>1,'name'=>'will','age'=>23), array('id'=>2,'name'=>'myth','age'=>32), array('id'=>3,'name'=>'allen','age'=>27), array('id'=>4,'name'=>'martin','age'=>23) ); foreach($arr as $k=>$v){ $tag1[]=$v['age']; //age排序字段 $tag2[]=$v['id']; //id排序字段 } //相当于 select * from $arr order by $tag1 DESC,$tag2 ASC;//特点:$tag1、$tag2、$arr数组的元素个数必须要一致 array_multisort($tag1,SORT_DESC,$tag2,SORT_ASC,$arr);//根据年龄从大到小排列,年龄相同则按id升序排列 echo "<pre>";print_r($arr);exit;
/**
* 第19题: php如何获取当前页面的url?如:"https://www.demo.com/index.php?username=xiaoqiang"
*/
function curPageURL() { $pageURL = 'http'; if (!empty($_SERVER['HTTPS'])) { $pageURL .= "s"; } $pageURL .= "://"; if ($_SERVER["SERVER_PORT"] != "80") { $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; } else { $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; } return $pageURL; } echo curPageURL();
/**
* 第20题: php如何强制下载文件?
*/
# 有时我们不想让浏览器直接打开文件,如PDF文件,而是要直接下载文件,那么以下函数可以强制下载文件,函数中使用了application/octet-stream头类型
function download($filename){ if ( (isset($filename)) && (file_exists($filename)) ){ header("Content-length: ".filesize($filename)); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $filename . '"'); readfile("$filename"); }else { echo "似乎文件不存在"; } } download( 'test_123.zip' );