前言:我自己用此类回调函数,来替代 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

array_map 等php回调函数使用问题(关联数组下标获取)的更多相关文章

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

    定义和用法 array_reduce() 函数向用户自定义函数发送数组中的值,并返回一个字符串. 注释:如果数组是空的且未传递 initial 参数,该函数返回 NULL. 说明 array_redu ...

  2. js回调函数,字符串,数组小析

    (一)回调函数:是指通过函数参数传递到其他代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序.在抖动函数中,回调函数用于在实现一些功能之后采取的另外的措施,比如div,照片抖 ...

  3. [PHP]将回调函数作用到给定数组的单元上

    ---------------------------------------------------------------------------------------------------- ...

  4. Perl关联数组用法集锦

    本文和大家重点讨论一下Perl关联数组的概念,创建Perl关联数组,从数组变量复制到Perl关联数组,元素的增删,用Perl关联数组循环等内容,相信通过本文的学习你对Perl关联数组的用法一定会有深刻 ...

  5. php回调函数的使用

    1.array_map — 将回调函数作用到给定数组的单元上 参数:array array_map ( callable $callback , array $arr1 [, array $... ] ...

  6. PHP 基础函数(四)回调函数

    array_walk($arr,'function','words');  使用用户函数对数组中的每个成员进行处理(第三个参数传递给回调函数function)

  7. 异步编程(回调函数,promise)

    一.回调函数 ①概念:一般情况下,程序会时常通过API调用库里所预先备好的函数.但是有些库函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务.这个被传入的.后又被调用的函数就称为回调函 ...

  8. cocos2dx[3.2](10) 新回调函数std::bind

    在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐. 而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器Eve ...

  9. 使用进程池模拟多进程爬取url获取数据,使用进程绑定的回调函数去处理数据

    1 # 使用requests请求网页,爬取网页的内容 2 3 # 模拟使用进程池模拟多进程爬取网页获取数据,使用进程绑定的回调函数去处理数据 4 5 import requests 6 from mu ...

随机推荐

  1. git 入门级使用

    git-book 全局配置:(配置完之后,进行一次密码设置之后,无需再使用密码进行分支管理) git config --global user.name "zhxj" git co ...

  2. 2017iOS开发最新的打包测试步骤(亲测)

    最近也是忙着修改项目,今天把最近遇到的问题和知识给大家分享一下. 有时候我们需要将我们的项目发给测试组进行bug测试,这时候我们就需要把自己的项目打包,生成一个二维码或者链接的形式,给测试组,接下来就 ...

  3. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  4. yum 安装redis

    1.yum install redis 2.yum install php-redis 3service redis start chkconfig redis on

  5. [Swift通天遁地]六、智能布局-(4)给视图添加锚点约束

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. Python3安装Scrapy

     Microsoft Visual C++ Build Tools 最近项目在写爬虫,项目经理给了个Python Scrapy的爬虫项目,要求使用Java实现相关功能.于是乎在本地先后安装了Pytho ...

  7. 简单认识http协议

    1.什么是TCP/IP  如果要了解一个人,可以从他归属的集体聊起来.我们的HTTP协议就属于TCP/IP协议家族中的一员,了解HTTP协议再整个网络流程中的地位,也能更加充分的理解HTTP协议. 要 ...

  8. [Luogu 2678] noip15 子串

    [Luogu 2678] noip15 子串 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出 ...

  9. android webview 简单应用

    一直没有用过webView 在网上找了一个小例子,主要实现以下功能: 1.当webview加载网页的时候在标题栏上显示加载进度 2.隐藏webkit浏览器的地址栏 3.设置程序的标题为网页的标题 4. ...

  10. SQL Sever语言 存储过程及触发器

    存储过程:就像函数一样的会保存在数据库中-->可编程性-->存储过程 创建存储过程: 保存在数据库表,可编程性,存储过程create proc jiafa --需要的参数@a int,@b ...