快速的去除数组中的指定值

此篇随笔来自于一道面试题,记录下

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(计算数组的差集)方法巧妙的去除数组中指定的值

原文地址:https://www.cnblogs.com/MRPUNK/p/3013139.html