zoukankan      html  css  js  c++  java
  • array_map 等php回调函数使用问题(关联数组下标获取)

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

  • 相关阅读:
    [LeetCode]Search a 2D Matrix
    [LeetCode]Trapping Rain Water
    [LeetCode]Container With Most Water
    [LeetCode]Permutations
    [LeetCode]Missing Number
    [LeetCode]Set Matrix Zeroes
    [LeetCode]Find Peak Element
    [LeetCode]Balanced Binary Tree
    [LeetCode]Spiral Matrix II
    [LeetCode]Spiral Matrix
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9974973.html
Copyright © 2011-2022 走看看