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框架代码 - 集合 的封装 -> 传送门

相关推荐