接着上一篇文章我们继续看面试php需要掌握的其他知识点,如递归的使用,数组排序等等
Q1:编写一段用最小代价实现将字符串完全反序, e.g. 将 “1234567890” 转换成 “0987654321”. (用前述你最熟悉的语言编写并标注简单注释, 不要使用函数)
A:
既然不允许使用函数,这里可以用到循环,和变量是否为空函数的判断
$s = '1234567890'; $o = ''; $i = 0; while(isset($s[$i]) && $s[$i] != null) { $o = $s[$i++].$o; } echo $o;
Q2:请用递归实现一个阶乘求值算法 F(n): n=5;F(n)=5!=5*4*3*2*1=120
A:
什么是递归?
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归,就是在运行的过程中调用自己。
function F($n){ if($n==0){ return 1; }else{ return $n* F($n-1); } }var_dump(F(5));
Q3:将字符长fang-zhi-gang 转化为驼峰法的形式:FangZhiGang
A:这个考点就是字符串的处理,涉及到的函数就是首字母大写,字符串和数组的互转
//方法一 function Fun($str){ if(isset($str) && !empty($str)){ $newStr=''; if(strpos($str,'-')>0){ $strArray=explode('-',$str); $len=count($strArray); for ($i=0;$i<$len;$i++){ $newStr.=ucfirst($strArray[$i]); } } return $newStr; } } //方法二function Fun($str){ $arr1=explode('_',$str); $str = implode(' ',$arr1); return ucwords($str); } var_dump(Fun("fang-zhi-gang")); //FangZhiGang
Q4:数组内置的排序方法有哪些?
A:这个就是考对php自带数组函数的掌握情况,数组去重,按照首字母排序,按照时间顺序等等经常在项目用到
sort($array); //数组升序排序 rsort($array); //数组降序排序 asort($array); //根据值,以升序对关联数组进行排序 ksort($array); //根据建,以升序对关联数组进行排序 arsort($array); //根据值,以降序对关联数组进行排序 krsort($array); // 根据键,以降序对关联数组进行排序 usort($array); // 使用用户自定义的比较函数对数组中的值进行排序,要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。 uasort($array); // 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 uksort($array); // 使用用户自定义的比较函数对数组中的键名进行排序 natcasesort($array); // 不区分大小写字母的自然排序(排完字母再排数字),保持键值关联 natsort($array); // 用“自然排序”算法对数组排序,保持键值关联 shuffle($array); // 本函数打乱(随机排列单元的顺序)一个数组。键值不关联
Q5:用PHP写出显示客户端IP与服务器IP的代码
A:获取客户端的ip也是经常用到,判断ip一天只能投票一次,记录用户登录是否异常等等
$_SERVER["REMOTE_ADDR"] $_SERVER["SERVER_ADDR"]
php自带变量就可以,但是这个有时候获取不到,我们要更严格的判断
php获取客户端ip
function getIp() { if ($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"], "unknown")) { $ip = $_SERVER["HTTP_CLIENT_IP"]; } else { if ($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")) { $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; } else { if ($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")) { $ip = $_SERVER["REMOTE_ADDR"]; } else { if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown") ) { $ip = $_SERVER['REMOTE_ADDR']; } else { $ip = "unknown"; } } } } return ($ip); } echo getIp();
php获取服务器ip
客户端IP相关的变量 1. $_SERVER['REMOTE_ADDR']; 客户端IP,有可能是用户的IP,也有可能是代理的IP。 2. $_SERVER['HTTP_CLIENT_IP']; 代理端的IP,可能存在,可伪造。 3. $_SERVER['HTTP_X_FORWARDED_FOR']; 用户是在哪个IP使用的代理,可能存在,可以伪造。 服务器端IP相关的变量 1. $SERVER_NAME,需要使用函数gethostbyname()获得。这个变量无论在服务器端还是客户端均能正确显示。 2. $HTTP_SERVER_VARS["SERVER_ADDR"],在服务器端测试:127.0.0.1(这个与httpd.conf中BindAddress的设置值相关)。在客户端测试结果正确。 3. $_SERVER['LOCAL_ADDR'] 、$HTTP_SERVER_VARS['LOCAL_ADDR'],测试中,未获得任何结果(测试环境PHP5)。
Q6:语句include和require的区别是什么
A:都是应用代码,什么时候用require什么时候用include呢
require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
include有返回值,而require没有(可能因为如此require的速度比include快)
包含文件不存在或者语法错误的时候require是致命的错误终止执行,include不是
include()是有条件包含函数,而 require()则是无条件包含函数。
nclude()执行时需要引用的文件每次都要进行读取和评估,
require()执行时需要引用的文件只处理一次(实际上执行时需要引用的文件内容替换了require()语句)
可以看出若有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高,
若每次执行代码时相读取不同的文件或者有通过一组文件叠代的循环,就使用include(),
require通常使用方法,这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。
include通常使用方法,这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化
另外关于include和require后面是否加括号的问题,
理论上来说:include和require后面加不加括号对执行结果没有区别,但是加上括号效率较低,所以后面能不加括号就不加括号。
Q7:session与cookie的区别?
A:session和cookie也是经常用到,笼统的就是一个在客户端一个在服务器端,但是这样回答不会给你面试加分,我们要说的更加具体,比如在商城购物车,或者投票等等实例会用到
(1)Cookie以文本文件格式存储在浏览器中,而session存储在服务端它存储了限制数据量。它只允许4kb它没有在cookie中保存多个变量。cookie以文本格式存储在浏览器上,存储量有限;而会话存储在服务端,可以无限量存储多个变量并且比cookie更安全
(2)cookie的存储限制了数据量,只允许4KB,而session是无限量的
(3)我们可以轻松访问cookie值但是我们无法轻松访问会话值,因此它更安全
(4)设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
Q8:PHP 不使用第三个变量实现交换两个变量的值
A:思路多种有字符串替换和函数list,数组的使用
//方法一 $a.=$b; $b=str_replace($b,"",$a); $a=str_replace($b,"",$a); //方法二 list($b,$a)=array($a,$b); var_dump($a,$b);