美文网首页
PHP常用数组函数

PHP常用数组函数

作者: 手扶拖拉机_6e4d | 来源:发表于2022-09-07 00:18 被阅读0次
    • 1.过滤函数:array_filter
    实例(结合正则,返回数组中满足条件的值):
    $array = [1,-2,-99,0,'wudy','123sss',37];
            $positive = array_filter($array,function ($number){
                $patten = "/^[0-9]*$/i";
                if(preg_match($patten,$number)){
                    return $number ;
                }
            });
    print_r($positive);   //Array ( [0] => 1 [6] => 37 )
    
    //array_filter删除空值(0、空字符、false )
            $number = [-1,0,'',2,'ssss',false ,true ];
            $not_empty = array_filter($number);
    print_r($not_empty); //Array ( [0] => -1 [3] => 2 [4] => ssss [6] => 1 )
    
    
    //array_filter  结合  in_array  对两个二维数组求差集
     $a = [
                [
                    'id' => 4043,
                    'violation_no' => 201808171000007,
                    'violation_indicator_no' => 10030,
                    'violation_indicator_name'=> '这是一个只有行为警告的违规指标'
                ],
                [
                    'id' => 4044,
                    'violation_no' => 201808171000007,
                    'violation_indicator_no' => 10069,
                    'violation_indicator_name'=> '永久封号2'
                ],
                [
                    'id' => 4045,
                    'violation_no' => 201808171000007,
                    'violation_indicator_no' => 10089,
                    'violation_indicator_name'=> '两个富文本警告'
                ]
    
            ];
    
           $b = [
               [
                   'id' => 4043,
                   'violation_no' => 201808171000007,
                   'violation_indicator_no' => 10030,
                   'violation_indicator_name'=> '这是一个只有行为警告的违规指标'
               ],
               [
                   'id' => 4045,
                   'violation_no' => 201808171000007,
                   'violation_indicator_no' => 10089,
                   'violation_indicator_name'=> '两个富文本警告'
               ]
    
           ];
    
            $c = $this->get_diff_array_by_filter($a,$b ) ;
           Lib_Func::P($c);die;
    
           Array
    (
        [1] => Array
            (
                [id] => 4044
                [violation_no] => 201808171000007
                [violation_indicator_no] => 10069
                [violation_indicator_name] => 永久封号2
            )
    )
    
           
        public function get_diff_array_by_filter($arr1, $arr2)
        {
            try {
                return array_filter($arr1, function ($v) use ($arr2) {
                    return !in_array($v, $arr2);
                });
            } catch (\Exception $exception) {
                return $arr1;
            }
        }
    
      1. array_map(),你可以对数组中的每个元素执行回调方法
    $cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga'];
    $aliases = array_map('strtolower', $cities);
    print_r($aliases) ;     //Array ( [0] => berlin [1] => kyiv [2] => amsterdam [3] => riga )
    
    
    $numbers = [1, -2, 3, -4, 5];
        $squares = array_map(function ($number) {
            return $number ** 2;
        }, $numbers);
    
     print_r($squares) ;  //Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
    
    • 3.array_walk
    // 同时将数组的键名和键值传入到回调函数,和array_map() 类似,但是工作原理完全不同
    //array_walk以引用传值方式传入,所以 array_walk() 不会创建新数组,而是直接修改原数组
    //作为源数组,可以将数组的值以引用传递方法传入回调函数,数组的键名直接传入就好了
    $fruits = [
        'banana' => 'yellow',
        'apple' => 'green',
        'orange' => 'orange',
    ];
    
    array_walk($fruits, function (&$value, $key) {
        $value = $key . ' is ' . $value;
    });
    
    print_r($fruits);   //Array ( [banana] => banana is yellow [apple] => apple is green [orange] => orange is orange )
    
    • 4.数组的数学运算
    使用 array_sum() 对数组元素进行求和运算,可以存在字符串,会自动忽略英文字符
     $numbers = [1, 2, 3, 4, 5,'6','abcd'];
     print_r(array_sum($numbers)); //21
    
    array_product 对数组元素执行乘积运算,只能存在数字字符
    $numbers = [1, 2, 3, 4, 5,'6'];
    print_r(array_product($numbers));   //720
    
    使用 array_reduce() 处理自定义运算规则,只能存在数字字符:
    $numbers = [1, 2, 3, 4, 5,'6'];
    $a = array_reduce($numbers,function ($carry,$item){
        return $carry ? $carry / $item : 1 ;
    });
    print_r($a) ;   //0.0013888888888889 =  1/2/3/4/5/6
    
    // array_reduce 实现foreach数组求和:
            $list = [1,2,3,4];
     $total = array_reduce($list, function ($result, $v){
               var_dump($v) ;
             echo "\n";
                var_dump($result);
                 echo "\n";
                   return $result + $v;
        }, 100);
      print_r($total);
    // $result 为上一次迭代产生的值, $v为当前迭代的值, $initial表示 $result的初始值
    输出结果:
    

    int(1)
    int(100)
    int(2)
    int(101)
    int(3)
    int(103)
    int(4)
    int(106)
    110

    //array_reduce 还可以实现 "SELECT * from user where user_id in (1,2,3,4)" 
     $list = [1,2,3,4];
            $str = array_reduce($list, function ($result, $v){
                return $result . ',' . $v;
            });
     echo trim($str, ',');die;
    
    //输出:1,2,3,4
    
    // array_map
    $list = ['1', ' 2', '  3', ' 4', '5   '];
    print_r($list);
    $list = array_map('trim', $list);
    print_r($list);
    
    Array
    (
        [0] => 1
        [1] => 2
        [2] =>  3
        [3] =>  4
        [4] => 5 
    )
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
    )
    
    类似的写法还有 array_map('intval', $list);   array_map('htmlspecialchars', $list)
    
      1. array_count_values
    //统计数组中值的出现次数,可以使用 array_count_values() 函数。它将返回一个新数组,新数组键名为待统计数组的值,新数组的值为待统计数组值的出现次数
    
    $peple = ['wudy','timo','peter','timo','given','wudy','peter'];
    $value = array_count_values($peple);
    print_r($value);   //Array ( [wudy] => 2 [timo] => 2 [peter] => 2 [given] => 1 )
    
      1. array_slice
    //获取数组中的部分元素 - 比如,获取前三个元素
     $numbers = range(1, 10);
     $top = array_slice($numbers, 0, 3);
     print_r($top);// [1, 2, 3]
    
    • 7.PHP排序数组
    PHP 中有关排序的函数都是 引用传值 的,排序成功返回 true 排序失败返回 false。排序的基础函数是 sort() 函数,它执行排序后的结果不会保留原索引顺序
    
     排序函数可以归为以下几类:
     a保持索引关系进行排序
     k依据键名排序
     r对数组逆向排序
     u使用用户自定义排序规则排序
    
    image.png
    • 8.数组函数的组合使用
        //通过 array_filter() 和 array_map() 函数仅需一行代码就可以完成空字符截取和去空处理:
        $values = ['say', ' bye', '', ' to', ' spaces ', ' '];
        $words = array_filter(array_map('trim', $values));
        print_r($words); //Array ( [0] => say [1] => bye [3] => to [4] => spaces )
    
        //获取出现频率最高的数组元素,我们可以使用 array_count_values()、arsort() 和 array_slice() 这几个函数:
        $letters = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd'];
        $values = array_count_values($letters);
        print_r($values);   //Array ( [a] => 4 [b] => 2 [c] => 1 [d] => 5 )
        arsort($values);
        print_r($values); //Array ( [d] => 5 [a] => 4 [b] => 2 [c] => 1 )
        $top = array_slice($values, 0, 3);
        print_r($top) ; //Array ( [d] => 5 [a] => 4 [b] => 2 )
    
        //通过array_sum 与 array_map 函数计算订单价格
           $orders = [ 
                ['product_id' => 1, 'price' => 99, 'count' => 1],
                ['product_id' => 2, 'price' => 50, 'count' => 2],
                ['product_id' => 2, 'price' => 17, 'count' => 3],
            ];
           $sum = array_sum(array_map(function ($item){
                     return  $item['price'] * $item['count'] ;
                 },$orders) );
           print_r($sum) ;               //250
    
    
    • 9.PHP中常用的过滤器函数
    //filter_var()函数:如果验证通过返回原值,否则返回false
    验证格式:
      $input = [
              'age' => 18,
              'sex' => 'sex',
              'email' => '313890735qq.com',
         ];
      var_dump( filter_var($input['email'], FILTER_VALIDATE_EMAIL));    //输出:bool(false)
      var_dump( filter_var($input['age'], FILTER_VALIDATE_INT));          // 输出:int(18)
      //第二个参数的取值:
      1>FILTER_VALIDATE_BOOLEAN   .当第一个参数是”1″, “true”, “on” and “yes” 这些字符串时会返回true .否则为false 。所以当用户输入一些 类似布尔类型的值时,你就无需一个个去写if else了。这个参数帮你搞定自动转换
      2>FILTER_VALIDATE_EMAIL  验证是否为电子邮箱格式
      3>FILTER_VALIDATE_FLOAT  验证是否为FLOAT类型
      4>FILTER_VALIDATE_INT     验证是否为INT类型
      5>FILTER_VALIDATE_IP       验证是否为IP地址
      6>FILTER_VALIDATE_MAC   验证是否是mac地址
      7>FILTER_VALIDATE_REGEXP  判断是否是正则表达式(基于PCRE)。这个很有用哦。尤其做后台时,管理员可能需要进行正则内容的填写。
      8>FILTER_VALIDATE_URL 是否是合法的URL
    
      //净化过滤:FILTER_SANITIZE_NUMBER_INT   过滤掉非数字型的内容
      $result = 'wudy123abc666';
      var_dump(filter_var($result,FILTER_SANITIZE_NUMBER_INT));   //输出:"123666"
    
      FILTER_SANITIZE_MAGIC_QUOTES(在预定义的字符串前面设置反斜杠\), 一定义的字符串有( '  "  \  null ) ,相当于 addslashes(),设置为FILTER_SANITIZE_MAGIC_QUOTES的过滤器会对字符串执行 addslashes() 函数。
    
      $res = "fuck'123" ;
      var_dump(filter_var($res,FILTER_SANITIZE_MAGIC_QUOTES));  //输出:"fuck\'123"
    
      $res = 'fuck \/ 23' ;
      var_dump(addslashes($res)); //输出:"fuck \\/ 23"
      var_dump(filter_var($res,FILTER_SANITIZE_MAGIC_QUOTES));   //输出:"fuck \\/ 23"
    
    
       FILTER_SANITIZE_STRING: 过滤器去除或编码不需要的字符,用于去除标签以及删除或编码不需要的字符,可能的选项或标志:
       FILTER_FLAG_NO_ENCODE_QUOTES - 该标志不编码引号
       FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
       FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
       FILTER_FLAG_ENCODE_LOW - 编码 ASCII 值在 32 以下的字符
       FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
       FILTER_FLAG_ENCODE_AMP - 把 & 字符编码为 & 
    
       $data = "123";
       var_dump(filter_var($data,FILTER_SANITIZE_STRING));   //输出: "123"
     
    
       $data2 = "fuck < 5 >6" ;
       var_dump(filter_var($data2, FILTER_SANITIZE_STRING)) ;  //输出: "fuck 6"
    
    • 10数组取指定的键名
      //对数组 
      $raw = ['id' => 1, 'name' => 'zane', 'password' => '123456'];
      //只想取包含了id和name的部分
      public function test($array, $keys){
            return array_intersect_key($array, array_flip($keys));
      }
      调用: $this->test($raw, ['id', 'name'])
      输出:
    
      Array
      (
          [id] => 1
          [name] => zane
      )
    
    
    • 11.数组移除指定键名
      $raw = ['id' => 1, 'name' => 'zane', 'password' => '123456'];
      public function removeKeys($array, $keys){
          return array_diff_key($array, array_flip($keys));
      }
      调用:$this->removeKeys($raw, ['id', 'name'])
      输出:
    
      Array
      (
          [password] => 123456
      )
    

    相关文章

      网友评论

          本文标题:PHP常用数组函数

          本文链接:https://www.haomeiwen.com/subject/ctunnrtx.html