PHP 提供豐富的高階數組函數,能以聲明式方式完成合並、分割、統計、差集等複雜操作。本文系統講解 array_combine、array_chunk、array_count_values、array_diff 系列、array_diff_key、array_diff_uassoc 等核心函數,附帶實戰場景與避坑指南。
$keys = ['green', 'red', 'yellow']; $values = ['avocado', 'apple', 'banana']; $combined = array_combine($keys, $values); /* 結果: Array ( [green] => avocado [red] => apple [yellow] => banana ) */ // ⚠ 陷阱:數組長度必須相等,否則報錯返回 false // ⚠ 鍵名重複會覆蓋(後者勝出) $keys = ['a', 'a', 'b']; $values = [1, 2, 3]; array_combine($keys, $values); // ['a' => 2, 'b' => 3]
$input = ['a', 'b', 'c', 'd', 'e']; // 不保留鍵名(重新索引 0,1...) print_r(array_chunk($input, 2)); /* 結果: Array ( [0] => Array ([0] => a, [1] => b) [1] => Array ([0] => c, [1] => d) [2] => Array ([0] => e) // 最後一組可能不足 ) */ // 保留原鍵名 print_r(array_chunk($input, 2, true)); /* 結果: Array ( [0] => Array ([0] => a, [1] => b) [1] => Array ([2] => c, [3] => d) [2] => Array ([4] => e) ) */ // 實戰:分頁處理大數據 $items = range(1, 1000); $pages = array_chunk($items, 50); // 每頁 50 條,共 20 頁 foreach ($pages as $page_num => $page_items) { process_page($page_num, $page_items); }
$array = [1, "hello", 1, "php", "hello"]; $counts = array_count_values($array); /* 結果: Array ( [1] => 2 [hello] => 2 [php] => 1 ) */ // 實戰:找出重複項 $duplicates = array_filter($counts, fn($c) => $c > 1); // [1 => 2, hello => 2] // ⚠ 限制:只能處理字符串/整數值,對象/數組會報警
| 函數 | 比較依據 | 鍵名保留 | 回調支持 | 說明 |
|---|---|---|---|---|
array_diff | 值 | 是 | 否 | 值在 arr1 不在 arr2... |
array_diff_assoc | 鍵+值 | 是 | 否 | 鍵值對必須完全相同 |
array_diff_key | 鍵 | 是 | 否 | 只比較鍵名 |
array_diff_uassoc | 鍵+值 | 是 | 是(鍵比較) | 自定義鍵比較邏輯 |
array_diff_ukey | 鍵 | 是 | 是(鍵比較) | 自定義鍵比較 |
array_udiff | 值 | 是 | 是(值比較) | 自定義值比較邏輯 |
array_udiff_assoc | 鍵+值 | 是 | 是(鍵+值) | 自定義鍵值比較 |
array_udiff_uassoc | 鍵+值 | 是 | 是(鍵+值) | 分離鍵值比較回調 |
// array_diff:值差集 $arr1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"]; $arr2 = ["a" => "green", "yellow", "red"]; $result = array_diff($arr1, $arr2); // ["b" => "brown", "c" => "blue"] // "red" 值存在於 arr2 被移除 // array_diff_assoc:鍵值對差集 $result = array_diff_assoc($arr1, $arr2); // ["b" => "brown", "c" => "blue", 0 => "red"] // arr1[0]="red" vs arr2[1]="red" 鍵不同 // array_diff_key:鍵差集 $arr1 = ['blue' => 1, 'red' => 2, 'green' => 3]; $arr2 = ['green' => 4, 'blue' => 5, 'yellow' => 6]; $result = array_diff_key($arr1, $arr2); // ['red' => 2] // 只有 'red' 鍵在 arr1 不在 arr2 // array_diff_uassoc:自定義鍵比較 function key_compare($a, $b) { return ($a > $b) ? 1 : (($a < $b) ? -1 : 0); } $arr1 = ["a" => "green", "b" => "brown", "c" => "blue", "red"]; $arr2 = ["a" => "green", "yellow", "red"]; $result = array_diff_uassoc($arr1, $arr2, "key_compare"); // 使用回調比較鍵名,而非內部嚴格比較
// 數字序列 range(0, 12); // [0,1,2,...,12] range(0, 100, 10); // [0,10,20,...,100] 步長 10 // 字母序列 range('a', 'i'); // ['a','b',...,'i'] range('c', 'a'); // ['c','b','a'] 逆序 // 實戰:生成年份選項 $years = range(date('Y'), 1900); // 當前年份倒序到 1900
count($keys) === count($values)array_diffarray_diff_assocarray_diff_key_uassoc/_ukey/_udiff 系列=== 比較值,字符串 "1" ≠ 整數 1array_flip + isset 索引優化// 本地數據 vs 遠程數據,檢測新增、刪除、修改 $local = [ 1 => ['name' => 'A', 'v' => 1], 2 => ['name' => 'B', 'v' => 2], 3 => ['name' => 'C', 'v' => 3] ]; $remote = [ 1 => ['name' => 'A', 'v' => 1], // 相同 2 => ['name' => 'B', 'v' => 20], // 修改 4 => ['name' => 'D', 'v' => 4] // 新增 ]; // 以 ID 為鍵比較 $local_ids = array_keys($local); $remote_ids = array_keys($remote); $deleted_ids = array_diff($local_ids, $remote_ids); // [3] $added_ids = array_diff($remote_ids, $local_ids); // [4] $common_ids = array_intersect($local_ids, $remote_ids); // [1,2] $modified_ids = []; foreach ($common_ids as $id) { if ($local[$id] !== $remote[$id]) { // 深度比較 $modified_ids[] = $id; // [2] } }
善用高階數組函數,能將複雜的數據變換邏輯簡化為清晰的聲明式代碼,減少 Bug、提升可維護性。