PHP里面最强大的工具,就是数组,它融合了多种数据结构的特点,数组、队列、栈、哈希表等等,而且容器可以兼容各种类型,任意嵌套,简直无所不能。围绕着数组,PHP原生支持了一些列的函数,使得数组在实际编程实践中,可以有更强的表达能力和更高的编程效率。但是这要求我们用PHP的方式去思考,尽量使用PHP原生的函数解决问题,而不是掌握了一个foreach就一招鲜吃遍天。
 
本文谈论的就是一个数组函数,array_reduce,我在文章的标题中,使用了“降维”这个词语,因为我联想到了《三体》里面的维度攻击,能把三维变二维,实现毁灭性打击,array_reduce当然不是攻击用的,但是array_reduce可以帮助我们实现降维,将一维数组“降维”成单一字符串。当然,array_reduce的可以但不仅限于实现这个功能,这取决于运用过程中,程序员对问题的抽象能力。
 
这里讲一种应用场景:从数据库中按照某种条件,取出一组记录,然后按照某种规则,将某个特定字段,拼接成一个单一字符串。举个简单的例子,比如我们常见的联表查询,如果两张表,位于不同的DB,不同的物理机,甚至是通过开放API拉取回来的数据,那么我们可能没法使用简单的联表查询,只能分步骤查询,先查询一个结果集,将结果集主键拼接成IN语句,再到另一个DB去查询结果集。
 
 <?php
……
$results1 = fetch_results($db, $sql);
$ids = array();
foreach ($results1 as $record) {
$ids[] = $record['id'];
} $sql = "SELECT * FROM tbl_another_table WHERE post_id IN (" .implode(',', $ids) .")";
$results2 = fetch_results($other_db, $sql);
这是非常常见的一种写法,思路非常自然、直接,也未见什么冗余,但是我觉得,这不是PHP思考问题的方式。PHP的思考方式,是像这样:
 
 <?php
function test() {
……
$results1 = fetch_results($db, $sql); $ids = trim(array_reduce($results1, 'retrive_ids'), ','); $sql = "SELECT * FROM tbl_another_table WHERE post_id IN ($ids)";
$results2 = fetch_results($other_db, $sql);
……
} function retrieve_ids(&$ids, $record) {
return $ids . ',' . $record['id'];
}
我可能没法证明,第二种写法,比第一种写法要高多少效率,减少多少运行时间,但是我更提倡第二种写法,因为第二种写法,是按照PHP的方式在思考问题,提供了更好的语义,更强的表达,retrieve_ids函数还可以复用在类似的场景里。很多情况下,函数里大段的foreach遍历,都并非为了表达业务本身,而只是为了取得某种中间结果,而PHP提供了工具,帮助我们避免这种局面,而让自己的代码更加简洁易读。这并非炫耀什么奇技淫巧,这只是PHP自己的正常的方式而已。

php中使用array_reduce给数组降维的更多相关文章

  1. 优雅的数组降维——Javascript中apply方法的妙用

    将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转换.本文将从朴素的循环转换开始,逐一介绍三 ...

  2. 数组降维-JavaScript中apply方法妙用

    海纳百川,有容乃大 1.普通循环转换方式 将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转 ...

  3. Javascript实现的数组降维——维度不同,怎么谈恋爱

    数组的元素可能是数组,这样一层层嵌套,可能得到一个嵌套很深的数组,数组降维要做的事就是把嵌套很深的数组展开,一般最后得到一个一维数组,其中的元素都是非数组元素,比如数组[1, [2, 3, [4, 5 ...

  4. Javascript实现的数组降维——维度不同,怎么谈恋爱(修订版)

    数组的元素可能是数组,这样一层层嵌套,可能得到一个嵌套很深的数组,数组降维要做的事就是把嵌套很深的数组展开,一般最后得到一个一维数组,其中的元素都是非数组元素,比如数组[1, [2, 3, [4, 5 ...

  5. apply的理解和数组降维

    func.apply(thisObj, [argArray] ); apply方法用来改变函数执行时的this指向,后面的参数是一个类数组对象,可以是数组,arguments,甚至一个有length属 ...

  6. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  7. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  8. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  9. C++中,申请字符串数组可用new实现

    C++中,申请字符串数组可用new实现: char ** list = new char*[MAX_NUM]; for (int i = 0; i< MAX_LOOP; i++) list[i] ...

随机推荐

  1. jsp:jstl标签之控制流程

    下面将要讲的用于流程控制的标签,其中包括:if.choose.when 与 otherwise 等.接下来对这些标签逐一讲解. 这个标签的作用和 Java 程序中的 if 语句作用相同,用于判断条件语 ...

  2. Ajax-快速上手前后端交互

    Ajax 在之前自己也有总结过关于Ajax的笔记,各种的懵圈,通过一次项目和几次的总结和分享,我对Ajax终于算是有了一定的理解和自己的见解.相信大家见过和度过了很多的关于Ajax的什么前世今生.大刀 ...

  3. php实现微信扫码自动登陆与注册功能

    本文实例讲述了php实现微信扫码自动登陆与注册功能.分享给大家供大家参考,具体如下: 微信开发已经是现在程序员必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单 ...

  4. logz.io一个企业级的ELK日志分析器 内部集成了机器学习识别威胁——核心:利用用户对于特定日志事件的反馈处理动作来学习判断日志威胁 + 类似语音识别的专家系统从各方收集日志威胁信息

    转自: 可看到它使用机器学习算法来识别DNS安全问题 http://logz.io/blog/machine-learning-log-analytics/ A Machine Learning Ap ...

  5. 遍历Newtonsoft.Json.Linq.JObject

    JObject 遍历: 引用命名空间:using Newtonsoft.Json.Linq; JObject _jObject = JObject.Parse("{'ID':'001','M ...

  6. 计算机_软件技巧_01_优雅地再word中插入代码

    二.参考资料 1.如何优雅的在 Microsoft word中插入代码

  7. hbase_异常_05_End of File Exception between local host is: "rayner/127.0.1.1"; destination host is: "localhost":9000;

    一.异常信息 java.io.EOFException: End of File Exception between local host is: "ubuntu/127.0.1.1&quo ...

  8. LeetCode OJ:Subsets(子集)

    Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...

  9. spring MVC HandlerInterceptorAdapter

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  10. PhotoShop使用指南(1)——动态图gif的制作

    第一步:菜单栏 > 窗口 > 工作区 > 动感 第二步:时间轴 > 设置延迟时间 第三步:时间轴 > 设置循环次数 第四步:存储为Web所用格式 Ctrl+Shift+A ...