前言:我自己用此类回调函数,来替代 foreach 纯粹是用为代码的简洁性,让代码更好看。(我有点代码小洁癖~)

1、array_reduce

当迭代处理一个一维索引数组时,在回调函数内是无法获取到当时元素索引的。所以想要获取时,需得借助一个外部变量。

目的:把 $arr 遍历到 <select><option></option></select>标签内(就是拼接option字符串)


$arr = [
0 =&gt; '全部',
1 =&gt; 'a',
2 =&gt; 'b',
3 =&gt; 'c',
];

解决:


$index = 0; $options = array_reduce($data, function($carry, $item) use (&amp;$index){
## $index则为当前两个元素 $item 的索引
return $carry . '&lt;option value="' . $index++ . '"&gt;' . $item . '&lt;/option&gt;';
}, ''); var_dump($options);

输出为


&lt;option value="0"&gt;全部&lt;/option&gt;&lt;option value="1"&gt;a&lt;/option&gt;&lt;option value="2"&gt;b&lt;/option&gt;&lt;option value="3"&gt;c&lt;/option&gt;

2、array_map(callable $callback , array $array1 [, array $... ] )

很多情况下,迭代的数据一般为一个 二维关联数组,但 array_map 本身在回调函数的函数体内无法获取到 关联数组的下标 的。

目的:在回调体内获取迭代关联数组的下标值。

解决:可以把关联数组的下标通过 array_map()的第三个形参把下标传进去。



$arr = [
'a' =&gt; 1,
'b' =&gt; 2,
'c' =&gt; 3
]; $res = array_map(function($item, $key){ echo '$arr[' . $key . ']=' . $item . '&lt;br&gt;'; }, $arr, array_keys($arr));

输出结果为


$arr[a]=1
$arr[b]=2
$arr[c]=3

题外话,有个典型的应用,也可以这样用。打个比方,如入库商品。


&lt;form action=""&gt;
&lt;input type="text" name="goods" value="辣条"&gt; &lt;input type="text" name="spec[attr][]" value="颜色"&gt;
&lt;input type="text" name="spec[value][]" value="红色"&gt; &lt;input type="text" name="spec[attr][]" value="口感"&gt;
&lt;input type="text" name="spec[value][]" value="辣"&gt; &lt;input type="text" name="spec[attr][]" value="副作用"&gt;
&lt;input type="text" name="spec[value][]" value="The `菊花` is hot"&gt;
&lt;/form&gt; &lt;?php ## 接受商品的基本信息与规格信息
$arr = $_GET;
print_r($arr); /*
Array
(
[goods] =&gt; 辣条
[spec] =&gt; Array
(
['attr'] =&gt; Array
(
[0] =&gt; 颜色
[1] =&gt; 口感
[2] =&gt; 副作用
) ['value'] =&gt; Array
(
[0] =&gt; 红色
[1] =&gt; 辣
[2] =&gt; The `菊花` is hot
) ) )
*/ ## 处理规格信息,使其可以批量添加
$arr['spec'] = array_map(function($item, $key){
return [
'attr' =&gt; $key,
'value' =&gt; $item,
];
}, $arr['spec']['value'], $arr['spec']['attr']); print_r($arr);
/*
Array
(
[goods] =&gt; 辣条
[spec] =&gt; Array
(
[0] =&gt; Array
(
[attr] =&gt; 颜色
[value] =&gt; 红色
) [1] =&gt; Array
(
[attr] =&gt; 口感
[value] =&gt; 辣
) [2] =&gt; Array
(
[attr] =&gt; 副作用
[value] =&gt; The `菊花` is hot
) ) )
*/ # 这样处理好数组就特别方便,数组中 `商品的规格` 的就可以批量添加了

参考资料:

laravel框架代码 - 集合 的封装 -> 传送门

原文地址:https://segmentfault.com/a/1190000016050974

最新文章

  1. javascript小技巧(非常全)
  2. guava学习--Supplier Suppliers
  3. web开发中的 emmet 效率提升工具
  4. 【题解】【DP】【Leetcode】Climbing Stairs
  5. Gradle用户指南(章9:Groovy快速入门)
  6. iOS控件——UIView与UIImageView播放动画的实现方法
  7. arraylist的使用
  8. poj2136
  9. javascript继承的写法
  10. Mybatis3.2.1整合Spring3.1
  11. 虚拟机网络配置详解(NAT、桥接、Hostonly)
  12. 通用查询设计思想(2)- 基于ADO.Net的设计
  13. IE8下动态生成option无法设置文本内容
  14. &lt;转&gt;cookie和session的区别
  15. 【Zookeeper】源码分析之网络通信(三)之NettyServerCnxn
  16. hdu1599 find the mincost route
  17. scrapy-CrawlSpider的rules使用规则
  18. jQuery---ajax---error函数及其参数详解
  19. 第13章 GPIO—位带操作
  20. hdu-1069(dp)

热门文章

  1. JDK部分源码阅读与理解
  2. PCB SQL SERVER 发送邮件(异步改同步)
  3. androd基础入门---1环境
  4. c3p0-config.xml文件简单说明与备忘
  5. U3D版本控制设置 Force Text优劣
  6. JavaScript入门三
  7. 洛谷1002 容斥原理+dfs OR DP
  8. 【BZOJ3527】[ZJOI2014] 力(FFT)
  9. ACM_最短网络(最小生成树)
  10. Android内存管理(12)*「实例」用Monitor 生成.hprof文件 并分析内存泄漏