參考:w3schools
昨天整理的基本上都是處理一維陣列的函式,今天整理二維陣列的函式,可以用在處理資料之類的
array_column()
: 從二維陣列中提取某一欄的值,並可選擇用另一欄作為鍵
格式 array_column(array, column_key, index_key)
參數說明:
array: 多維陣列
column_key: 要提取的欄位名稱或索引
index_key: 可選,用作新陣列索引的欄位
常見用法:二維關聯陣列
$data =
[
["id" => 1, "name" => "Peter"],
["id" => 2, "name" => "Ben"],
["id" => 3, "name" => "Joe"]
];
print_r(array_column($data, 'name'));
輸出
Array
(
[0] => Peter
[1] => Ben
[2] => Joe
)
說明: 從data這個2維關聯陣列裡面拿取name的value,能看到[0],[1],[2],這是陣列的索引從0開始
另外一個常見用法: 指定 key(第三個參數)
$data =
[
["id" => 1, "name" => "Peter"],
["id" => 2, "name" => "Ben"],
["id" => 3, "name" => "Joe"]
];
print_r(array_column($data, 'name', 'id'));
輸出
Array
(
[1] => Peter
[2] => Ben
[3] => Joe
)
說明: 這邊 第3個參數id 是取出來用來當 第2個參數的key,所以說現在key=1時他的value是Peter以此類推
在舉另外一個範例:
$data =
[
["id" => 1, "name" => "Peter"],
["id" => 2, "name" => "Ben"],
["id" => 3, "name" => "Joe"]
];
print_r(array_column($data, 'id', 'name'));
輸出
Array
(
[Peter] => 1
[Ben] => 2
[Joe] => 3
)
我把id和name對調了,可以發現他的key值由id變成了name,所以現在name是key去對應id(value)
array_column() 總結:
只有 2 個參數 → 純粹取值,key 就是 0,1,2… 的連續索引。
有第 3 個參數 → 指定新的 key,讓結果變成「關聯陣列」
array_map
: 對陣列套用函式,產生新陣列 格式 array_map(callback, array1, array2, ...)
參數說明:
callback: 要執行的函數
array1, array2, ...: 要處理的陣列(可多個)
<?php
function test($a,$b)
{
return $a + $b;
}
$a=[1,2,3];
$b=[4,5,6];
print_r(array_map("test", $a, $b));
?>
輸出
Array
(
[0] => 5
[1] => 7
[2] => 9
)
說明:
array_map("test", $a, $b) 會對應執行:
test(1, 4) → 回傳 5
test(2, 5) → 回傳 7
test(3, 6) → 回傳 9
array_filter
: 過濾陣列元素 格式 array_filter(array, callback)
參數說明:
callback: 回調函數
array: 要處理的陣列(只能處理單一陣列)
<?php
function longWords($word) {
return strlen($word) > 5;
}
$words = ["apple", "banana", "cat", "elephant", "dog", "butterfly"];
$longWords = array_filter($words, "longWords");
print_r($longWords);
?>
輸出
Array
(
[1] => banana
[3] => elephant
[5] => butterfly
) // 把字元數量沒有大於5的過濾掉
補充:
array_filter 也可以不用回調函數
<?php
$data = ["apple", "", "banana", null, "cherry"];
$result = array_filter($data); // 自動過濾假值
print_r($result);
?>
輸出
Array
(
[0] => apple
[2] => banana
[4] => cherry
)
array_reduce
: 將陣列變為單一值 格式 array_reduce(array, callback, initial)
參數說明:
array: 要處理的陣列
callback: 回調函數,接收兩個參數(累積值, 當前值)
initial: 可選,初始值
<?php
function sum($carry, $item) {
return $carry + $item;
}
$numbers = [1, 2, 3, 4, 5];
$total = array_reduce($numbers, "sum", 0);
echo $total; // 輸出: 15
?>
執行過程
次數 | $carry (初始或上次回傳) | $item | 計算方式 | 回傳值 |
---|---|---|---|---|
1 | 0 | 1 | 0 + 1 | 1 |
2 | 1 | 2 | 1 + 2 | 3 |
3 | 3 | 3 | 3 + 3 | 6 |
4 | 6 | 4 | 6 + 4 | 10 |
5 | 10 | 5 | 10 + 5 | 15 |
總結:
$carry:累積的結果(從初始值開始,每次更新)
$item:陣列中當前要處理的元素
所以 array_reduce 就是把陣列中的每個元素逐一與累積值結合,最終得到一個結果!
array_combine
: 將兩個陣列合併成一個關聯陣列 格式 array_combine(keys, values)
參數說明:
keys: 作為鍵的陣列
values: 作為值的陣列
<?php
$keys = ['name', 'age', 'city'];
$values = ['John', 25, 'Taipei'];
$result = array_combine($keys, $values);
print_r($result);
// 輸出:
// Array
// (
// [name] => John
// [age] => 25
// [city] => Taipei
// )
?>
注意: