array_map 等php回调函数使用问题(关联数组下标获取)
前言:我自己用此类回调函数,来替代 foreach 纯粹是用为代码的简洁性,让代码更好看。(我有点代码小洁癖~)
1、array_reduce
当迭代处理一个一维索引数组时,在回调函数内是无法获取到当时元素索引的。所以想要获取时,需得借助一个外部变量。
目的:把 $arr 遍历到 <select><option></option></select>标签内(就是拼接option字符串)
$arr = [
0 => '全部',
1 => 'a',
2 => 'b',
3 => 'c',
];
解决:
$index = 0;
$options = array_reduce($data, function($carry, $item) use (&$index){
## $index则为当前两个元素 $item 的索引
return $carry . '<option value="' . $index++ . '">' . $item . '</option>';
}, '');
var_dump($options);
输出为
<option value="0">全部</option><option value="1">a</option><option value="2">b</option><option value="3">c</option>
2、array_map(callable $callback , array $array1 [, array $... ] )
很多情况下,迭代的数据一般为一个 二维关联数组,但 array_map 本身在回调函数的函数体内无法获取到 关联数组的下标 的。
目的:在回调体内获取迭代关联数组的下标值。
解决:可以把关联数组的下标通过 array_map()的第三个形参把下标传进去。
$arr = [
'a' => 1,
'b' => 2,
'c' => 3
];
$res = array_map(function($item, $key){
echo '$arr[' . $key . ']=' . $item . '<br>';
}, $arr, array_keys($arr));
输出结果为
$arr[a]=1
$arr[b]=2
$arr[c]=3
题外话,有个典型的应用,也可以这样用。打个比方,如入库商品。
<form action="">
<input type="text" name="goods" value="辣条">
<input type="text" name="spec[attr][]" value="颜色">
<input type="text" name="spec[value][]" value="红色">
<input type="text" name="spec[attr][]" value="口感">
<input type="text" name="spec[value][]" value="辣">
<input type="text" name="spec[attr][]" value="副作用">
<input type="text" name="spec[value][]" value="The `菊花` is hot">
</form>
<?php
## 接受商品的基本信息与规格信息
$arr = $_GET;
print_r($arr);
/*
Array
(
[goods] => 辣条
[spec] => Array
(
['attr'] => Array
(
[0] => 颜色
[1] => 口感
[2] => 副作用
)
['value'] => Array
(
[0] => 红色
[1] => 辣
[2] => The `菊花` is hot
)
)
)
*/
## 处理规格信息,使其可以批量添加
$arr['spec'] = array_map(function($item, $key){
return [
'attr' => $key,
'value' => $item,
];
}, $arr['spec']['value'], $arr['spec']['attr']);
print_r($arr);
/*
Array
(
[goods] => 辣条
[spec] => Array
(
[0] => Array
(
[attr] => 颜色
[value] => 红色
)
[1] => Array
(
[attr] => 口感
[value] => 辣
)
[2] => Array
(
[attr] => 副作用
[value] => The `菊花` is hot
)
)
)
*/
# 这样处理好数组就特别方便,数组中 `商品的规格` 的就可以批量添加了
参考资料:
laravel框架代码 - 集合 的封装 -> 传送门
原文地址:https://segmentfault.com/a/1190000016050974
array_map 等php回调函数使用问题(关联数组下标获取)的更多相关文章
- array_reduce — 用回调函数迭代地将数组简化为单一的值
定义和用法 array_reduce() 函数向用户自定义函数发送数组中的值,并返回一个字符串. 注释:如果数组是空的且未传递 initial 参数,该函数返回 NULL. 说明 array_redu ...
- js回调函数,字符串,数组小析
(一)回调函数:是指通过函数参数传递到其他代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序.在抖动函数中,回调函数用于在实现一些功能之后采取的另外的措施,比如div,照片抖 ...
- [PHP]将回调函数作用到给定数组的单元上
---------------------------------------------------------------------------------------------------- ...
- Perl关联数组用法集锦
本文和大家重点讨论一下Perl关联数组的概念,创建Perl关联数组,从数组变量复制到Perl关联数组,元素的增删,用Perl关联数组循环等内容,相信通过本文的学习你对Perl关联数组的用法一定会有深刻 ...
- php回调函数的使用
1.array_map — 将回调函数作用到给定数组的单元上 参数:array array_map ( callable $callback , array $arr1 [, array $... ] ...
- PHP 基础函数(四)回调函数
array_walk($arr,'function','words'); 使用用户函数对数组中的每个成员进行处理(第三个参数传递给回调函数function)
- 异步编程(回调函数,promise)
一.回调函数 ①概念:一般情况下,程序会时常通过API调用库里所预先备好的函数.但是有些库函数却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务.这个被传入的.后又被调用的函数就称为回调函 ...
- cocos2dx[3.2](10) 新回调函数std::bind
在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐. 而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器Eve ...
- 使用进程池模拟多进程爬取url获取数据,使用进程绑定的回调函数去处理数据
1 # 使用requests请求网页,爬取网页的内容 2 3 # 模拟使用进程池模拟多进程爬取网页获取数据,使用进程绑定的回调函数去处理数据 4 5 import requests 6 from mu ...
随机推荐
- git-svn for mac
熟练使用 git ,新公司用的是 svn,这就尴尬了,为了这个习惯问题,我还是毅然坚持使用 git,但是又不与公司的 svn 冲突,所以就找到了 git 的 git-svn 插件. 在 mac 上使用 ...
- ios oc调用swift framework
1.oc 调用swift /*oc调用swift, project name为DeomOC: 1.oc工程DemoOC中显式创建一个swift文件,生成DemoOC-Bridging-Header.h ...
- HDU 5289 Assignment (二分+区间最值)
[题目链接]click here~~ [题目大意]: 给出一个数列,问当中存在多少连续子序列,子序列的最大值-最小值<k [思路]:枚举数列左端点.然后二分枚举右端点,用ST算法求区间最值.(或 ...
- 关于linux的用户
1 linux支持多个用户 2 每个登陆用户有自己的shell,自己的home目录 3 可以将用户分组 4 用户对文件有各自的权限,从而将用户分割 5 用户对应属于它的一批进程 6 可以执行addus ...
- Android 完全退出应用程序
随着业务逻辑越来越复杂,退出应用程序也不像之前那个直接将Activity finish()掉就可以了,在网上看到很多完全退出App的文章,但是实践之后发现,并不像文章中描述的那样,不是方法过时了,就是 ...
- linux 网络编程-基础篇01
#Socket简介 是一个编程接口是一种特殊的文件描述符(everything in Unix is a file)并不仅限于TCPIP协议面向连接(Transmission Control Prot ...
- poj3463 Sightseeing——次短路计数
题目:http://poj.org/problem?id=3463 次短路计数问题,在更新最短路的同时分类成比最短路短.长于最短路而短于次短路.比次短路长三种情况讨论一下,更新次短路: 然而其实不必被 ...
- PCB javascript解析Gerber274X格式实现方法
解析钻Gerber274X格式前首先得了解此格式,这样才能更好的解析呀. 一个Gerber274X里面包含的基本信息如下: 1.单位:公式mm,英制inch 2.省零方式:前省零,后省零 3.坐标方式 ...
- 1CSS简介
-------------------------------------------------------------------------------------------------- - ...
- 【LeetCode】 -- 68.Text Justification
题目大意:给定一个数组容器,里面存有很多string: 一个int maxWith.让你均匀安排每一行的字符串,能够尽可能的均匀. 解题思路:字符串+贪心.一开始想复杂了,总觉的题意描述的不是很清楚, ...