zoukankan      html  css  js  c++  java
  • php数组遍历函数array_reduce、array_filter()、array_map()、array_walk()三者的用法和区别

    array_reduce( arr , callablecallback )
    使用回调函数迭代地将数组简化为单一的值。其中arr 为输入数组,callback(result ,value)接受两个参数,result为上一次迭代产生的值,value是当前迭代的值。

    类似于laravel pluck的函数
    $arr = array_reduce($prodcuts,function (&$arr,$v){
        $arr[$v['id']] = $v['title'];
        return $arr;
    });
    
    //数组求和
    $a = [1,2,3];
    $num = array_reduce($a, function($result,$value){
        return $result+$value;
    })
    echo $num;//6
    
    //字符串拼接
    $arr = [
        ['id'=>1,'name'=>"c"],
        ['id'=>2,'name'=>"b"],
        ['id'=>3,'name'=>"a"]
    ];
    $str = array_reduce($arr, function($result, $value){
        return $result.",".$value['id'];
    });
    echo $str;//,1,2,3
    
    

    array_filter(array callback [, int $flag = 0 ]])
      依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
    array_filter会过滤掉任何值等于FALSE的值,也就是说 0值,空字符串,null,都会被过滤。

    简言之:利用自定义函数对原数组进行筛选

    示例1:
    $newarr2 = array_filter($arr, function($value){
        if ($value%2 ==0) return false;
        return true;
    });
    var_dump($newarr2);die;
    //输出结果
    array(2) {
      ["a"]=>
      int(1)
      ["c"]=>
      int(3)
    }
    
    示例2:
    $arr = ['a','b',1,2,3];
    	
    $new_arr = array_filter($arr,function($val){
        return is_numeric($val);
    });
    
    var_dump($new_arr);
    //返回结果
    //array (size=3)
    //  2 => int 1
    //  3 => int 2
    //  4 => int 3
    

    array_map()
      该函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
      可以传递多个数组,回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

    向array_map传入数组,出来的还是数组,而不是上面array_reduce()的一个值。
    所以,array_map()最简单的就是把callback函数作用到每个数组的值上,最常见的场景就是 intval()、trim() 数组中的值.
    简言之:有返回值,利用自定义函数对数组的每个元素进行修改

    示例1:
    
    //字符串转为整型
    $arr = ['1','2','3'];
    array_map('intval', $arr);
    
    示例2:
    $arr1 = [1,2,3,4,5];
    $arr2 = [6,7,8,9,10];
    
    //函数写前面,数组参数写后面
    $new_arr = array_map(function($val1,$val2){
       return $val1 + $val2;
    },$arr1,$arr2);
    
    var_dump($new_arr);
    //返回结果
    //array (size=5)
    //  0 => int 7
    //  1 => int 9
    //  2 => int 11
    //  3 => int 13
    //  4 => int 15
    

    array_walk()
      
    函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。

    注释:您可以通过把用户自定义函数中的第一个参数指定为引用:&$value,来改变数组元素的值

    简言之:没有返回值。将自定义函数作用于每个数组元素,但不会影响数组。自定义函数的第一个参数传引用则会影响数组

    示例1:
    #array_walk 传引用,第三个参数传给回调函数
    $arr = [1,2,3,4,5,6];
    $a = 2;
    
    //遍历数组arr,闭包函数的第三个参数可以额外传递一个变量
    array_walk($arr, function(&$v, $k, $a){
       $v = $v + $a;
    }, $a);
    var_dump($arr);die;
    
    
    示例2:
    //将数组中的元素用于某种操作
    $arr = ['a','b','c'];
    array_walk($arr,function($val,$key){
        echo "{$key} is {$val} <br/>";
    });
    //返回结果
    //0 is a
    //1 is b
    //2 is c
    
    //改变数组中的值,传参的时候使用引用
    array_walk($arr,function(&$val,$key){
        $val .= $val;
    });
    var_dump($arr);
    //array (size=3)
    //  0 => string 'aa' (length=2)
    //  1 => string 'bb' (length=2)
    //  2 => string 'cc' (length=2)
    

    异同点

    array_filter() 重点在于过滤(而不是新增)某个元素,当你处理到一个元素时,返回过滤后的数组
     array_map() 重点在于遍历一个数组或多个数组的元素,返回一个新的数组
     array_walk() 重点在于遍历数组进行某种操作, 对原数组进行操作

    array_filter() 和 array_walk()对一个数组进行操作,数组参数在前,函数参数在后
     array_map() 可以处理多个数组,因此函数参数在前,数组参数在后,可以根据实际情况放入多个数组参数

    array_filter()函数过滤空数组

    array_filter()如果没有给出回调函数,所有的等于 FALSE 的元素将会被移除掉

    
    
    $entry = array( 
                 0 => 'hello world', 
                 1 => false, 
                 2 => 1, 
                 3 => null, 
                 4 => '', 
                 5 => 'https://www.jb51.net', 
                 6 => '0',
                 7 => array(),
                 8 => 0
              );
    $validarr = array_filter($entry);
    print_r($validarr);
    //输出结果:
    Array
    (
        [0] => 'hello world'
        [2] => 1
        [5] => https://www.jb51.net
    )
    
    

    一些可以转化为布尔型FALSE的数组元素都被移除了,对我们想要得到一个有效的数组作了一个非常全面的过滤。

    array_walk_recursive处理多维数组,函数的参数是键和值

    1、取键值:
    
    array_walk_recursive($contentArr, function ($value, $key) use (&$result) {
        array_push($result, $key);
    });
    
    2、取键值:
    
    array_walk_recursive($contentArr, function ($value, $key) use (&$result) {
       array_push($result, $value);
    });
    
  • 相关阅读:
    MSSQL锁定1.Isolation level (myBased)
    等待状态CXPACKET分析
    拒绝了对对象 'sp_sdidebug'(数据库 'master',所有者 'dbo')的 EXECUTE 权限
    Oracle CBO 统计信息的收集与执行计划的选择
    Oracle 11gR1 on Win7
    读书笔记 <<你的知识需要管理>>
    ORA01555 总结
    Buffer Cache Management
    如何选择合适的索引
    书评 <SQL Server 2005 Performance Tuning性能调校> 竟然能够如此的不用心........
  • 原文地址:https://www.cnblogs.com/caibaotimes/p/14282519.html
Copyright © 2011-2022 走看看