array_map 等php回撥函式使用問題(關聯陣列下標獲取)
阿新 • • 發佈:2018-11-17
前言:我自己用此類回撥函式,來替代 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
框架程式碼 - 集合
的封裝 -> 傳送門