zoukankan      html  css  js  c++  java
  • PHP数组处理函数的使用array_reduce(二)

    关于PHP数组操作函数更为细致的用法大家还可以参考PHP在线参考手册:http://php.net/manual/zh/index.php

    array_reduce — 用回调函数迭代地将数组简化为单一的值

    给定一个数组:

    $ar = array(1,2,3,4,5);

    如果要求得这个数组中各个元素之和。

    方法一:

    很自然的用foreach实现

    1 $sum = 0;
    2 foreach ($ar as $v) {
    3     $sum+=$v;
    4 }
    5 echo $sum;
    View Code

    方法二:

    我们可以用array_reduce实现。它是专门用来迭代数组的。该函数最多接收三个参数。

    第一个参数接收数组

    第二个参数函数名,也可以是匿名函数,函数有两个参数,分别代表$result和$item

    第三个参数(可选),该参数将被当成是数组中的第一个值来处理,或者如果数组为空的话就作为最终返回值。

    1 function leijia($a,$b){
    2     $a+=$b;
    3     return $a;
    4 }
    5 $result = array_reduce($ar ,leijia);
    6 echo $result;
    View Code

    继续优化,在PHP5.3以上中可以用匿名函数了。使代码更精简。

    1 $result = array_reduce($ar ,function($a,$b){
    2     $a+=$b;
    3     return $a;
    4 });
    View Code

    array_reduce的强大不仅如此。看下面的例子。将数组$arr的首个元素弹出,作为初始值,避免min($result['min'], $item['min'])中$result为空。

    否则最终结果min是空的。

     1 $arr = array( 
     2     array('min' => 1.5456, 'max' => 2.28548, 'volume' => 23.152), 
     3     array('min' => 1.5457, 'max' => 2.28549, 'volume' => 23.152), 
     4     array('min' => 1.5458, 'max' => 2.28550, 'volume' => 23.152), 
     5     array('min' => 1.5459, 'max' => 2.28551, 'volume' => 23.152), 
     6     array('min' => 1.5460, 'max' => 2.28552, 'volume' => 23.152), 
     7 ); 
     8 
     9 $initial = array_shift($arr); 
    10 
    11 $t = array_reduce($arr, function($result, $item) { 
    12     $result['min'] = min($result['min'], $item['min']); 
    13     $result['max'] = max($result['max'], $item['max']); 
    14     $result['volume'] += $item['volume']; 
    15 
    16     return $result; 
    17 }, $initial);
    View Code

    总之,这种写法比foreach更优雅,更少的定义变量。推荐使用。

    很明显,上一篇文章(PHP数组处理函数的使用array_push(一))我们就可以这样实现:

    1 $ids = array_reduce($user, function($v,$w){
    2         $v[$w["id"]]=$w["name"];
    3         return $v;
    4     });
    View Code

    实现效果:

  • 相关阅读:
    #转 并查集详解
    美素数
    Wireless Network
    寒假CF- WA了不要怕!
    寒假CF1 小呀小苹果儿
    (专题赛)A Bug's Life
    (周三赛)The Hardest Problem Ever
    (周三赛)A==B?
    (周三赛)还是畅通工程
    cursor改变鼠标样式
  • 原文地址:https://www.cnblogs.com/heyijing/p/4729848.html
Copyright © 2011-2022 走看看