array_map 等php回調函數使用問題(關聯數組下標獲取)

前言:我本身用此類回調函數,來替代 foreach 純粹是用爲代碼的簡潔性,讓代碼更好看。(我有點代碼小潔癖~)php

一、array_reducelaravel

當迭代處理一個一維索引數組時,在回調函數內是沒法獲取到當時元素索引的。因此想要獲取時,需得藉助一個外部變量。git

目的:把 $arr 遍歷到 <select><option></option></select>標籤內(就是拼接option字符串)github

$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>

二、array_map(callable $callback , array $array1 [, array $... ] )函數

不少狀況下,迭代的數據通常爲一個 二維關聯數組,但 array_map 自己在回調函數的函數體內沒法獲取到 關聯數組的下標 的。code

目的:在回調體內獲取迭代關聯數組的下標值。orm

解決:能夠把關聯數組的下標經過 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框架代碼 - 集合 的封裝 -> 傳送門

相關文章
相關標籤/搜索