PHP常用数组函数

  • 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常用数组函数)