使用array_reduce降维



PHP里面最强大的工具,就是数组,它融合了多种数据结构的特色,数组、队列、栈、哈希表等等,并且容器能够兼容各类类型,任意嵌套,简直无所不能。围绕着数组,PHP原生支持了一些列的函数,使得数组在实际编程实践中,能够有更强的表达能力和更高的编程效率。可是这要求咱们用PHP的方式去思考,尽可能使用PHP原生的函数解决问题,而不是掌握了一个foreach就一招鲜吃遍天。 php

本文谈论的就是一个数组函数,array_reduce,我在文章的标题中,使用了“降维”这个词语,由于我联想到了《三体》里面的维度攻击,能把三维变二维,实现毁灭性打击,array_reduce固然不是攻击用的,可是array_reduce能够帮助咱们实现降维,将一维数组“降维”成单一字符串。固然,array_reduce的能够但不只限于实现这个功能,这取决于运用过程当中,程序员对问题的抽象能力。 程序员

这里讲一种应用场景:从数据库中按照某种条件,取出一组记录,而后按照某种规则,将某个特定字段,拼接成一个单一字符串。举个简单的例子,好比咱们常见的联表查询,若是两张表,位于不一样的DB,不一样的物理机,甚至是经过开放API拉取回来的数据,那么咱们可能无法使用简单的联表查询,只能分步骤查询,先查询一个结果集,将结果集主键拼接成IN语句,再到另外一个DB去查询结果集。 sql

<?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本身的正常的方式而已。 编程

相关文章
相关标签/搜索