一个自定义函数带来的思考

  今天和战五渣老师讨论函数返回值和抛出异常时,我写了一个查找数组中是否具备某些键的函数。我总结的结果是在合适的场景使用抛出异常,通用函数依然是通过返回值来完成他的功能。

  不过还有更多的关于编程方面的收获:关于同样一个问题,换一种思考的角度可以写出不同的代码。

<?php
    //我需要定义一个函数,用来判断给定的数组中是否包含我所需要全部的键
    //根据需求,普通的解决思路
    function checkKey($array,$key)
    {
        if(!is_array($array)) {
            // not array
            return false;
        }
        $key = explode(',',$key);
        foreach($key as $k => $v) {
            if(!array_key_exists($v,$array)) {
                //not in array
                return false;
            }
        }
        return true;
    }
    //以下函数式战五渣老师提供的思路
    function newCheckKey($array,$key)
    {
        if(!is_array($array)) {
            return false;
        }
        $key = explode(',',$key); 
        $array_keys = array_keys($array); //取出给定数组的所有键
        $array_intersect  = array_intersect($array_keys,$key) ; //计算给定数组所有键与需要检查的键去交集
        if($array_intersect === $key) {
              return true; //如果取得的交集是$key本身,说明$array包含有所有需要的键
        }
        return false; 
    }        
     //一种可读性非常低的写法
    function newCheckKey2($array,$key)
    {
        if(!is_array($array)) {
            return false;
        }
        $key = explode(',',$key);
        return array_intersect(array_keys($array),$key) === $key;
    }

    $data = ['zhanwuzha'=>'renzhewudi','bool'=>'jintiantuiqunle'];
    var_dump(checkKey($data,'zhanwuzha,bool'));        // true
    var_dump(checkKey($data,'zhanwuzha,bool,halei'));//false
    var_dump(newCheckKey($data,'zhanwuzha,bool'));  //true
    var_dump(newCheckKey($data,'zhanwuzha,bool,halei')); //false
    var_dump(newCheckKey2($data,'zhanwuzha,bool'));  //true
    var_dump(newCheckKey2($data,'zhanwuzha,bool,halei')); //false

  通过对比上面的代码,通过巧妙运用数学中集合的概念可以轻松的完成我想要的功能。通过foreach遍历数组也可以完成我需要的功能。当我们思考的更多一些的时候可能会获得更多的解决思路,可能通过对比改进不同方法就是我们水平提高的过程吧。

  另外我上面的第三个函数与第二个函数功能完全相同,但是少定义了两个变量,同时也降低了程序的可读性。当来维护难度会提高。不同的方法之间需要自己在以后的编程中进行取舍^_^

posted @ 2017-01-13 22:11  郭延龙  阅读(313)  评论(0编辑  收藏  举报