此篇随笔来自于一道面试题,记录下
1. 写一个 函数,array_remove(),要求最简洁的清除数组中值为$v的项。
/**
*解析:问题表述很清晰,假设函数原型是array_remove($v,$array),需要注意以下几点:
* 1.对于参数的检查:如果$array不是数组的话,返回错误或者抛出异常
* 2.如何比较数组的值与$v相等?是==还是===?存在分歧,在这里我们用==来比较
* 现在我们来给题目增加些佐料,加一些限制,对于如下限制,应该如何解决
* a.如果不使用系统函数。如何解决。
* b.参数传递问题:传递引用和传值对于函数编写会有何影响?分别实现之。
* c.可以使用系统函数情况下如何解决。
**/
1 /* 2 *针对条件a:如果不使用系统函数,那就直接遍历,遇到value等于$v的项目,就删除它(或者遇到不等于value的元素,就记录下来)。因而有两种方法 3 */ 4 /* 5 *方法一:直接传递引用,修改原数组 6 */ 7 function array_remove($v,&$array){ 8 if(!is_array($array)){ 9 throw new Exception("input param $array is not a legel,should be array\n"); 10 } 11 foreach($array as $key=>$value){ 12 if($v == $value){ 13 unset($array[$key]); 14 } 15 } 16 } 17 18 /* 19 *方法二:传递值,返回修改后的新数组 20 */ 21 function array_remove_2($v,$array){ 22 if(!is_array($array)){ 23 throw new Exception("input param $array is not a legel,should be array\n"); 24 } 25 $result = array(); 26 foreach($array as $key=>$value){ 27 if($value !== $v){ 28 $result[$key] = $value; 29 } 30 } 31 return $result; 32 }
对于限制条件b。两种解法分别见限制条件a的两种解法.
限制条件c,如果使用系统函数的话,有哪些解法
解法很多,最基本的,可以使用array_search找到value等于$v的索引,然后删除相应的元素,代码如下
1 /* 2 *方法三:使用php内置array_search方法解决 3 */ 4 5 function array_remove_by_array_search($v,&$array){ 6 if(!is_array($array)){ 7 throw new Exception("input param $array is not a legel,should be array\n"); 8 } 9 $key = array_search($array); 10 if($key !== false){ 11 unset($array[$key]); 12 } 13 }
代码中需要注意的地方是第十行:if($key !== false) 。这里的比较是 !==而不是 != 。为什么呢?这是因为:
array_search($v,$array);的结果可能是0(数组的第一个元素)。而在php中0==false但是0!== false.这是一个需要注意的地方。与这个情况类似的是遍历目录时候。
while(($file = readdir($handler))!==false)这也是防止出现名字为0的目录或文件而产生错误。
我个人又想到了一种方法,可以利用php的array_diff函数来解决
1 /* 2 *方法四:使用php函数array_diff来解决 3 */ 4 function array_remove_by_array_diff($v,$array){ 5 if(!is_array($array)){ 6 throw new Exception("input param $array is not a legel,should be array\n"); 7 } 8 $arr = array($v); 9 $result = array_diff($array,$arr); 10 return $result; 11 }
方法四中是有些讨巧,通过将$v存入一个临时数组,然后将$array与此临时数组比对差异,最后将$array中有$v的项目排除后返回
利用php array_diff(计算数组的差集)方法巧妙的去除数组中指定的值