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


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

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

  • 相关阅读:
    洛谷 P1896 [SCOI2005]互不侵犯(状压DP)
    POJ 3208 Apocalypse Someday(数位DP)
    HDU 3555 Bomb(数位DP)
    HDU 3652 B-number(数位DP)
    蜂鸣器版天空之城
    【洛谷习题】小木棍[数据加强版]
    【NOIP2009】靶形数独
    【洛谷习题】填涂颜色
    【NOIP2003】加分二叉树
    【NOIP2000】单词接龙
  • 原文地址:https://www.cnblogs.com/MRPUNK/p/3013139.html
Copyright © 2020-2023  润新知