前言:我本身用此類回調函數,來替代 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
框架代碼 - 集合
的封裝 -> 傳送門