1. 程式人生 > >array_map 等php回撥函式使用問題(關聯陣列下標獲取)

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