首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 進階數組操作實戰:array_combine、array_chunk、array_count_values、array_diff 系列完全指南

     編輯:PHP 相關知識

PHP 提供豐富的高階數組函數,能以聲明式方式完成合並、分割、統計、差集等複雜操作。本文系統講解 array_combine、array_chunk、array_count_values、array_diff 系列、array_diff_key、array_diff_uassoc 等核心函數,附帶實戰場景與避坑指南。

array_combine() —— 兩數組合並為鍵值對


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

array_chunk() —— 分割數組,可選保留鍵名


$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_count_values() —— 統計值出現次數


$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 系列 —— 差集運算全家桶

函數比較依據鍵名保留回調支持說明
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() —— 快速生成序列數組


// 數字序列
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

最佳實踐與避坑

  1. array_combine 長度檢查:調用前驗證 count($keys) === count($values)
  2. array_chunk 分頁神器:大數據分批處理、分頁顯示首選
  3. array_count_values 類型限制:值必須是 scalar,對象需先轉字符串
  4. 差集選型原則:
    • 只關心值差異 → array_diff
    • 關聯數組需鍵值都匹配 → array_diff_assoc
    • 只比鍵名 → array_diff_key
    • 複雜比較邏輯 → _uassoc/_ukey/_udiff 系列
  5. 嚴格比較陷阱:所有 diff 函數默認用 === 比較值,字符串 "1" ≠ 整數 1
  6. 性能提示:大數組差集操作較慢,考慮用 array_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、提升可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved