// 函数式编程

$users = array(
array('id' => 1, 'name' => 'abc1', 'age' => 29, '性别' => '男'),
array('id' => 2, 'name' => 'abc2', 'age' => 21, '性别' => '女'),
array('id' => 3, 'name' => 'abc3', 'age' => 23, '性别' => '男'),
array('id' => 4, 'name' => 'abc4', 'age' => 25, '性别' => '女'),
array('id' => 5, 'name' => 'abc5', 'age' => 20, '性别' => '女'),
array('id' => 6, 'name' => 'abc6', 'age' => 24, '性别' => '男'),
array('id' => 7, 'name' => 'abc7', 'age' => 28, '性别' => '女'),
array('id' => 8, 'name' => 'abc8', 'age' => 27, '性别' => '男'),
); //获取性别为女的用户
$arrayFilter = array_filter($users, function($item){
return $item['性别'] == '女' ;
}); // 不影响原数组,返回一个新数组
$arrayMap = array_map(function($item){
return array(
'id' => $item['id'],
'name' => $item['name'],
'age' => $item['age'],
'gender' => $item['性别'] == '男' ? 'male' : 'female',
);
}, $users); // 修改原数组,对年龄+10处理,同时新增索引gender,返回值 1 或 0
array_walk($users, function(&$item, $index){
$item['gender'] = $item['性别'] == '男' ? 'male' : 'female';
if ($index % 2 == 0) {
$item['age'] += 10;
}
}); //array_reduce(array $input , callable $function [,$initial = NULL ]) 用回调函数迭代地将数组简化为单一的值
// 求最大年龄的用户,返回最大年龄用户信息
$arrayReduce = array_reduce($users, function($init, $val){
return $init['age'] > $val['age'] ? $init : $val;
}, array('age' => 0)); // 求平均年龄
$avgAge = array_reduce($users, function($init, $item){
return $init + $item['age'];
}, 0) / count($users); /*
* array_reduce 的内部实现方式
function array_reduce($data, $callback, $initial) {
foreach ($data as $index => $val) {
$initial = $callback($initial, $val);
}
return $initial;
}
*/

//用array_map和array_mutisort来排序 
//利用array_map获取要依据排序的数组,(匿名函数 create_function($args, return $val))
//$arrField = array_map(create_function('$item', 'return $item["age"];'), $users); 【不推荐】
$arrField = array_map(function($item){
return $item['age'];
}, $users); //利用array_mutisort来进行年龄从大到小排序
$arrSort = array_multisort($arrField, SORT_DESC, $users);

  

//闭包实现计数器
function counts() {
$a = 1;
// 闭包,引用变量$a
return function() use(&$a) {
return $a++;
};
} $countFunc = counts();
echo $countFunc(); // 1
echo $countFunc(); // 2
echo $countFunc(); // 3
echo $countFunc(); // 4

  

php函数式编程的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. [学习笔记]JavaScript之函数式编程

    欢迎指导与讨论:) 前言 函数式编程能使我们的代码结构变得简洁,让代码更接近于自然语言,易于理解. 一.减少不必要的函数嵌套代码 (1)当存在函数嵌套时,若内层函数的参数与外层函数的参数一致时,可以这 ...

  3. 函数式编程之柯里化(curry)

    函数式编程curry的概念: 只传递给函数一部分参数来调用函数,然后返回一个函数去处理剩下的参数. var add = function(x) { return function(y) { retur ...

  4. 关于Java8函数式编程你需要了解的几点

    函数式编程与面向对象的设计方法在思路和手段上都各有千秋,在这里,我将简要介绍一下函数式编程与面向对象相比的一些特点和差异. 函数作为一等公民 在理解函数作为一等公民这句话时,让我们先来看一下一种非常常 ...

  5. Haskell 函数式编程快速入门【草】

    什么是函数式编程 用常规编程语言中的函数指针.委托和Lambda表达式等概念来帮助理解(其实函数式编程就是Lambda演算延伸而来的编程范式). 函数式编程中函数可以被非常容易的定义和传递. Hask ...

  6. java1.8函数式编程概念

    有关函数式编程 ·1 函数作为一等公民 特点:将函数作为参数传递给另外一个函数:函数可以作为另外一个函数的返回值 ·2 无副作用 函数的副作用指的是函数在调用过程中,除了给出了返回值外,还修改了函数外 ...

  7. 让JavaScript回归函数式编程的本质

    JavaScript是一门被误会最深的语言,这话一点不假,我们看下它的发展历史. 1995年,Netscape要推向市场,需要一门脚本语言来配套它.是使用一门已有的语言,还是发明一门新的语言,这也不是 ...

  8. python基础-函数式编程

    python基础-函数式编程  高阶函数:map , reduce ,filter,sorted 匿名函数:  lambda  1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层 ...

  9. python函数 与 函数式编程

    「函数」一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序), ...

  10. Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程

    Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程 这里的函数式编程的设计以muduo为例进行对比说明: Reactor实现架构对比 面向对象的设计类图如下: 函数式编程以muduo为例 ...

随机推荐

  1. 【原】The Linux Command Line - Workiing with commands

    ● type – Indicate how a command name is interpreted● which – Display which executable program will b ...

  2. faster rcnn源码阅读笔记3

  3. 十四、ChainOfResponsibility 责任链模式

    设计: 代码清单: Trouble: public class Trouble { private int number; public Trouble(int number){ this.numbe ...

  4. oracle可重复执行脚本(添加字段)

    --添加债券期限字段 declare cn integer; begin cn := 0; select count(*) into cn from user_tab_cols t where t.t ...

  5. jquery 设置某div里面的内容为此div里面非img标签的内容

    $('#div_1').html($('#div_1').children().not("img")); 要注意 <div id="#div_1"> ...

  6. jsp中<c:if>标签的用法

    <c:if test="${(tbl.column1 eq '值') and (tbl.column2 eq 'str')}"> <table>...< ...

  7. Mybatis配置问题解决Invalid bound statement (not found)

    首先这个异常的原因是系统根据Mapper类的方法名找不到对应的映射文件. 网上也搜索了到了类似的文章,一般可以从以下几个点排查: mapper.xml的namespace要写所映射接口的全称类名,而且 ...

  8. 设计模式学习心得<工厂方法 Factory Method>

    概述 意图 业务代码中常常有构造对象的过程,它拥有大量的参数.并且有很多地方需要这对象. 简化对象构造过程. 主要解决 一个类在不同场景的频繁地创建,让不同对象的创建更有语义化,提高代码复用性. 何时 ...

  9. python_day8_socket

    目录 客户端/服务器架构 socket逻辑结构 socket概念 套接字的概念 TCP与UDP套接字应用 recv与recvfrom的区别 粘包现象及处理 认证客户端的链接合法性 socktserve ...

  10. 20175316盛茂淞 2018-2019-2 《Java程序设计》第5周学习总结

    20175316盛茂淞 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 第六章 接口与实现. 何谓接口 接口:书上没有明确地给出接口的定义,我理解的接口就是一 ...