zoukankan      html  css  js  c++  java
  • 【php】php常用函数代码封装(一)数组篇

     下面这些都是我在工作中用到的函数,现在整理下。

    1.判断是否是一个数组

    function _is_array($value){
        if (is_array($value)) {
            return true;
        } else {
            if(is_object($value) && is_array(json_decode(json_encode($value),true))){
               return true;
            }
            return (is_object($value) && $value instanceof Traversable);//实现这个接口对象可以foreach
        }
    }

     2.比较数组是否相等

    function arraysEqual($arr1, $arr2){
        if(count($arr1) != count($arr2)){
            return false;
        }else{
            $arrStr1 = serialize($arr1);
            $arrStr2 = serialize($arr2);
            if( strcmp($arrStr1, $arrStr2)==0 ){//strcmp区分大小写 strcasecmp二进制安全比较字符串(不区分大小写)
                return true;
            }else{
                return false;
            }
        }
    }

    测试

    $compare_arr1 = [1,2,3,['one'=>'1','2']];
    $compare_arr2 = [1,2,3,['one'=>'1','2']];
    var_dump(arraysEqual($compare_arr1,$compare_arr2));

     3.找到数组中最长的字符串

    function get_longstr($array){
        $strlen_arr = array_combine($array, array_map('strlen', $array));
        return array_keys($strlen_arr, max($strlen_arr));
    }

    $str_arr = ['aaagggggggggggggg','abngfdgfdgdf','bbbb','ccccc','121',666668];

    print_r(get_longstr($str_arr));

    输出

    Array ( [0] => aaagggggggggggggg )

     4.找到多维数组中最长的字符串 

    $count_arr= [];
    $arr = array_walk_recursive($str_arr,function ($arr) use (&$count_arr){  //主要利用函数array_walk_recursive()递归数组
        $count_arr = $count_arr + [$arr=>strlen($arr)];
    });
    $str_arr = ['aaa','33','bb','ccccc','121','666668',['kkkkkk','key'=>'ddddddddffff','ddd2222222sk',[5555,'kkkkksskkkkkkkkkk']]];
    print_r(array_keys($count_arr, max($count_arr)));

    输出

    Array ( [0] => kkkkksskkkkkkkkkk )

     5.过滤数组中不是数组的元素

    $array_filter_arr = function(array $data, callable $f){
                return array_filter($data, function() use(&$f) {
                    return call_user_func_array($f, func_get_args());
                });
    };
    $arr = [22,55,['ddd','lkk'],[1,[2]]];
    print_r($array_filter_arr($arr,'is_array'));

    输出

    Array ( [2] => Array ( [0] => ddd [1] => lkk ) [3] => Array ( [0] => 1 [1] => Array ( [0] => 2 ) ) )

     6.清空数组

    function _destruct_one($object){
        if (_is_array($object)) {
            $length = count($object);
            while($length--){
                array_splice($object,$length,1);
            }
        }
        return $object;
    }
    var_dump(_destruct_one([1,2,'d','key'=>'k']));  //array(0) {}

     上面函数是清空整个数组内容,那么有时候需要清空数组中的空值或者false等值,我们需要重新写个函数。

    下面这个函数可以递归过滤多维数组中 空白字符,负值,false,null

    /*$arr   要删除的数组
     * $trim  是否对字符trim操作
     * $unsetEmptyArr  是否删除空的子数组
     */
    function _arrRemoveEmpty(&$arr,$trim = true,$unsetEmptyArr=false){
        foreach ($arr as $key => $value) {
            if(is_array($value)) {
                _arrRemoveEmpty($arr[$key]);
            }else{
                $value = trim($value);
                if ($value == '') {
                    unset($arr[$key]);
                }elseif ($trim){
                    $arr[$key] = $value;
                }
            }
        }
        if(is_bool($unsetEmptyArr) && $unsetEmptyArr){
            $arr = array_filter($arr);
        }
        return $arr;
    }

     $entry = array(
      0 => 'foo' ,
      1 => false ,
      2 => - 1 ,
      3 => null ,
      4 => '',
      ['aa'=>'',false,true,'dd'],
      [false]
    );
    print_r(_arrRemoveEmpty($entry,1,true));

    Array
    (
        [0] => foo
        [2] => -1
        [5] => Array
            (
                [1] => 1
                [2] => dd
            )
    
    )

     这里主要利用了php内置函数array_filter()的功能还有递归。

    7.数组中字段替换。

         我们替换数组的值会用php自带函数array_replace() ,手册解释如下

        array_replace() 函数使用后面数组元素的值替换第一个 array 数组的值。如果一个键存在于第一个数组同时也存在于第二个数组,它的值将被第二个数组中的值替换。如果一个键存在于第二个数组,但是不存在于第一个数组,则会在第一个数组中创建这个元素。如果一个键仅存在于第一个数组,它将保持不变。如果传递了多个替换数组,它们将被按顺序依次处理,后面的数组将覆盖之前的值。

    $arr1 = ['id' => 10, 'name' => 'jack', 'sex' => 'man'];
    $arr2 = ['id' => 12, 'name' => 'tom', 'sex' => 'female','height'=>'162cm'];
    $arr = array_replace($arr1,$arr2);
    print_r($arr);
    Array
    (
        [id] => 12
        [name] => tom
        [sex] => female
        [height] => 162cm
    )

     结果中$arr1里没有键值'height'=>'162cm'也被添加进去了,如果开发中不想新增,只想替换有的。

    下面这个函数可以实现该功能。

    function _arrOverWrite($array, $cover_array){
        $key_intersect_arr = array_intersect_key($cover_array, $array);//返回$cover_array出现在$array的键名的值
        foreach ($key_intersect_arr as $key => $value) {
            $array[$key] = $value;//替换赋值
        }
        if (func_num_args() > 2) {
            foreach (array_slice(func_get_args(), 2) as $cover_array) {
                foreach (array_intersect_key($cover_array, $array) as $key => $value) {
                    $array[$key] = $value;
                }
            }
        }
        return $array;
    }
    $arr1 = ['id' => '111', 'name' => 'jack', 'sex' => 'man','hobby'=>'book'];
    $arr2 = ['id' => '222', 'name' => 'tom', 'sex' => 'female','height'=>'162cm'];
    $arr3 = ['id' => '333', 'name' => 'kate', 'sex' => 'female','height'=>'162cm'];
    $arr = _arrOverWrite($arr1,$arr2,$arr3);
    print_r($arr);

     打印出

    Array
    (
        [id] => 333
        [name] => kate
        [sex] => female
        [hobby] => book
    )
    

     8.判断数组是否是关联数组

    function _is_assoc(array $array){
        $keys_arr = array_keys($array);
        return  array_keys($keys_arr) !== $keys_arr;
    }
    
    $arr1 = ['one'=>'aa','two'=>'tt'];
    var_dump((_is_assoc(['one'=>'aa','two'=>'tt'])));
    bool(true)

     9.快速检查数组中是否存在某个值

      这个函数手册里有,工作中直接用这个

    function _fast_in_array($needle, array $haystack, $strict = false){
        $c = count($haystack);
        if($strict !== true){
            for($i = 0; $i < $c; $i++){
                if($haystack[$i] == $needle){
                   return true;
                }
            }
        }else{
            for($i = 0; $i < $c; $i++){
                if($haystack[$i] === $needle){
                   return true;
                }
            }
        }
        return false;
    }
    
    var_dump(_fast_in_array('aa',['aa','bb','cc']));    //true

     或者下面这个方法

    function inArray($item, $array) {
        $flipArray = array_flip($array);
        return isset($flipArray[$item]);
    }

     10.合并多个数组

    /*
     * 作用 递归合并两个或多个数组。关联数组中的值用相同的键覆盖以前的值。索引数组中的值,被追加,但只有在结果中不存在时才追加。
     * $array1 arr
     * $array2 arr
     * return merged_arr
     */
    function _recursively_array_merge($array1, $array2){
            if (_is_assoc($array2)) {//关联数组
                foreach ($array2 as $key => $value) {
                    if (is_array($value)  && isset($array1[$key]) && is_array($array1[$key])){
                        $array1[$key] = _recursively_array_merge($array1[$key], $value);
                    }else{
                        $array1[$key] = $value;
                    }
                }
            }else{//索引数组
                foreach ($array2 as $value){
                    if (!in_array($value, $array1, true)){
                        $array1[] = $value;
                    }
                }
            }
            if (func_num_args() > 2){
                foreach (array_slice(func_get_args(), 2) as $array2){
                    if (_is_assoc($array2)){
                        foreach ($array2 as $key => $value){
                            if (is_array($value) && isset($array1[$key]) && is_array($array1[$key])){
                                $array1[$key] = _recursively_array_merge($array1[$key], $value);
                            }else{
                                $array1[$key] = $value;
                            }
                        }
                    }else{
                        foreach ($array2 as $value){
                            if (!in_array($value, $array1, true)){
                                $array1[] = $value;
                            }
                        }
                    }
                }
            }
        return $array1;
    }

     demo

    $arr1 = ['one'=>'aaa','two'=>'bbb',['kk'=>'kk_val111']];
    $arr2 = ['one'=>'aaa','two'=>'bbbttt',1,['kk'=>'kk_val',5,'abc'=>'ww']];
    print_r(_recursively_array_merge($arr1,$arr2));
    

     Array ( [one] => aaa [two] => bbbttt [0] => 1 [1] => Array ( [kk] => kk_val [0] => 5 [abc] => ww ) )

    11.多维数组递归成一维数组

    function _arr_flatten($array){
        $isAssoc = _is_assoc($array);
        $flat_arr = [];
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $flat_arr = array_merge($flat_arr, _arr_flatten($value));
            }else{
                if ($isAssoc){
                    $flat_arr[$key] = $value;
                }else{
                    $flat_arr[] = $value;
                }
            }
        }
        return $flat_arr;
    }

     demo

    $arr = ['foo'=>[
        'bar'=>'bar_value',
        'bar_two'=>'bar_two_value',
        'bar_keys'=>[
            'a'=>'aaa',
            'b'=>'bbb',
            'c'=>'ccc',
        ]
    ],1,[1,2],'top'=>[
        'top_bar1'=>'top_bar_value1',
        'top_bar2'=>'top_bar_value2',
    ]];
    
    print_r(_arr_flatten($arr));
    

     Array (

      [bar] => bar_value

      [bar_two] => bar_two_value

      [a] => aaa

      [b] => bbb

      [c] => ccc

      [0] => 1

      [1] => 1

      [2] => 2

      [top_bar1] => top_bar_value1

      [top_bar2] => top_bar_value2

    )

    12.通过自定义分隔符设置路径获取数组中的值

     

    比如有个多维数组

    $arr = ['foo'=>[
    'bar'=>'bar_value',
    'bar_two'=>'bar_two_value',
    'bar_keys'=>[
    'a'=>'aaa',
    'b'=>'bbb',
    'c'=>'ccc',
    ]
    ],1,[1,2],'top'=>[
    'top_bar1'=>'top_bar_value1',
    'top_bar2'=>'top_bar_value2',
    ]];

    我想通过foo.bar_keys 这样的方式获取数组 $arr 在键为foo里面键为bar_keys的值
    /*
     * $array   arr
     * $path    自定义路径
     * $default 默认返回值
     * $delimiter 分隔符
    */
    function _path($array, $path, $default = null, $delimiter = null){
        if (!_is_array($array)) {
            return $default;
        }
        if (is_array($path)) {
            $keys = $path;
        }else {
            if (array_key_exists($path,$array)) {
                return $array[$path];
            }
            if ($delimiter === null) {
                $delimiter = '.';
            }
            $path = ltrim($path, "{$delimiter}");
            // 删除右边的delimiters, 空格,通配符
            $path = rtrim($path, "{$delimiter} *");//包含空格
            $keys = explode($delimiter, $path);
        }
        do {
            $key = array_shift($keys);//将数组开头的单元移出数组 最终清空数组
            if (ctype_digit($key)) {//ctype_digit()做纯数字检测
                $key = (int) $key;
            }
            if (isset($array[$key])) {
                if ($keys) {
                    if (_is_array($array[$key])) {
                        $array = $array[$key];//给$array在赋值
                    }else {
                        break;
                    }
                } else {
                    return $array[$key];
                }
            } elseif ($key === '*') {
                $values = [];
                foreach ($array as $arr) {
                    if ($value = _path($arr, implode('.', $keys))) {
                        $values[] = $value;
                    }
                }
                if ($values) {
                    return $values;
                } else {
                    break;
                }
            } else {
                break;
            }
        }while ($keys);
        return $default;
    }
    print_r(_path($arr,'foo.bar_keys')) ;

     打印出

    Array
    (
        [a] => aaa
        [b] => bbb
        [c] => ccc
    )

    也可以用*号,获取键top下所有的值
    print_r(_path($arr,'top.*')) ;
    

     结果是

    Array
    (
        [top_bar1] => top_bar_value1
        [top_bar2] => top_bar_value2
    )

    13.添加多个键值对到一个数组前面
    $arr = ['one'=>'one_value','two'=>'two_value'];
    array_unshift ( $arr ,  ['three_value'=>'three'] );
    array_unshift ( $arr ,  ['four'] );
    print_r ( $arr );
    

     结果是

    Array
    (
        [0] => Array
            (
                [0] => four
            )
    
        [1] => Array
            (
                [three_value] => three
            )
    
        [one] => one_value
        [two] => two_value
    )

    可是这不是我想要的结果
    function _arr_prepend($array, $append_arr){
       if(!empty($append_arr)){
          while (list( $key ,  $val ) =  each ( $append_arr )) {
               if(is_numeric($key)) {
                  array_unshift($array, $val);
               }else {
                  $array = [$key => $val] + $array;
               }
          }
       }
       return $array;
    }
    
    $arr = ['one'=>'one_value','two'=>'two_value'];
    print_r(_arr_prepend($arr,['four','three_value'=>'three']));
    

     结果

    Array
    (
        [three_value] => three
        [0] => four
        [one] => one_value
        [two] => two_value
    )
    

    14.统计数组的深度

    function _arraylevel($arr,&$result=0){//利用引用做参数  也可以用静态变量
        if(is_array($arr)){
            $result++;
            foreach ($arr as $v){
                _arraylevel($v,$result);
            }
        }
        return $result;
    }
    
    $str_arr = ['aaa',['bb',['cc',['dd']]]];
    echo _arraylevel($str_arr); //4
    

    15.获取字符串某标识符后面字符

    function str_last_after($subject, $search)
        {
            if ($search == '') {
                return $subject;
            }
    
            $pos = strripos($subject, $search);
    
            if ($pos === false) {
                return $subject;
            }
    
            return substr($subject, $pos + strlen($search));
        }

     16.递归数组每个成员应用函数

    function array_recursive(&$input, $funcname, $userdata = "")
        {
            if (!is_callable($funcname)) {
                return false;
            }
    
            if (!is_array($input)) {
                return false;
            }
    
            foreach ($input as $key => $value) {
                if (is_array($input[$key])) {
                    array_recursive($input[$key], $funcname, $userdata);
                } else {
                    $saved_value = $value;
                    if (!empty($userdata)) {
                        $funcname($value, $key, $userdata);
                    } else {
                        $funcname($value, $key);
                    }
    
                    if ($value != $saved_value) {
                        $input[$key] = $value;
                    }
                }
            }
            return true;
        }

     17.根据键值给二维数组排序(模仿sql语句排序)

    function arrayOrderBy(array &$arr, $order = null) {
         if (is_null($order)) {
             return $arr;
         }
         $orders = explode(',', $order);
         usort($arr, function($a, $b) use($orders) {
             $result = array();
             foreach ($orders as $value) {
                 list($field, $sort) = array_map('trim', explode(' ', trim($value)));
                 if (!(isset($a[$field]) && isset($b[$field]))) {
                     continue;
                 }
                 if (strcasecmp($sort, 'desc') === 0) {
                     $tmp = $a;
                     $a = $b;
                     $b = $tmp;
                 }
                 if (is_numeric($a[$field]) && is_numeric($b[$field]) ) {
                     $result[] = $a[$field] - $b[$field];
                 } else {
                     $result[] = strcmp($a[$field], $b[$field]);
                 }
             }
             return implode('', $result);
         });
         return $arr;
     }

     demo

    $arr = array(
                array('id' => 1, 'age' => 1, 'sex' => 6, 'name' => 'a'),
                array('id' => 2, 'age' => 3, 'sex' => 1, 'name' => 'c'),
                array('id' => 3, 'age' => 3, 'sex' => 1, 'name' => 'b'),
                array('id' => 4, 'age' => 2, 'sex' => 1, 'name' => 'd'),
    );
    print_r(arrayOrderBy($arr, 'age asc,sex asc,name desc'));

     上面函数是利用usort回调函数去处理数组的,那么也可以利用该函数做些别的,比如对比日期大小

    usort($monthArr, function ($time1, $time2) {
                $strtotimeLeft = strtotime($time1);
                $strtotimeRight = strtotime($time2);
                if ($strtotimeLeft == $strtotimeRight) {
                    return 0;
                }
                return ($strtotimeLeft < $strtotimeRight) ? 1 : -1;
    });

    demo

    $monthArr = array('2019-08-11','2019-09-11','2019-03-18',);
    print_r($monthArr);
    输出
    array (
      0 => '2019-09-11',
      1 => '2019-08-11',
      2 => '2019-03-18',
    )

    更新中.....

  • 相关阅读:
    Redis与Memcached的incr/decr差异对比
    Linux sudo用法与配置
    Docker 常用命令
    Linux之间配置SSH互信(SSH免密码登录)
    SVN服务器搭建
    shell中参数的传递
    【代码更新】IIC协议建模——读写EEPROM
    串口完整项目之串口收发字符串
    串口发送模块——1字节数据发送
    状态机设计——从简单的按键消抖开始
  • 原文地址:https://www.cnblogs.com/songgj/p/8480129.html
Copyright © 2011-2022 走看看