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

PHP 常用數組函數大全:分類詳解、實戰示例與性能優化指南

     編輯:PHP 相關知識

數組是 PHP 最核心的數據結構,掌握內置數組函數能讓代碼更簡潔、高效、符合「不重複造輪子」原則。本文按功能分類整理 50+ 高頻數組函數,附帶實戰示例、性能對比、常見陷阱與現代替代寫法。

一、創建與填充

| 函數 | 說明 | 示例 | |------|------|------| | array() / [] | 創建數組 | $a = [1, 2, 3]; $b = ['k' => 'v']; | | range() | 創建範圍數組 | range(1, 10); range('a', 'z'); range(0, 100, 10) | | array_fill() | 填充值 | array_fill(0, 5, 'x') // ['x','x','x','x','x'] | | array_fill_keys() | 指定鍵填充 | array_fill_keys(['a','b'], 0) // ['a'=>0,'b'=>0] | | compact() | 變量轉關聯數組 | compact('var1', 'var2') | | array_column() | 提取列 (PHP 5.5+) | array_column($users, 'name', 'id') |

二、鍵值操作

| 函數 | 說明 | 示例 | |------|------|------| | array_keys() | 獲取所有鍵 | array_keys($arr) | | array_values() | 獲取所有值(重置索引) | array_values($arr) | | array_flip() | 交換鍵值 | array_flip(['a'=>1]) // [1=>'a'] | | array_reverse() | 反轉順序 | array_reverse([1,2,3]) // [3,2,1] | | array_change_key_case() | 鍵名大小寫轉換 | array_change_key_case($arr, CASE_UPPER) | | array_combine() | 合併鍵值數組 | array_combine($keys, $values) |

三、增刪改查

添加/刪除

<?php
$arr = ['a', 'b', 'c', 'd'];

// 末尾添加
$arr[] = 'e';                    // 最快
array_push($arr, 'f', 'g');      // 多值

// 開頭添加
array_unshift($arr, 'start');    // 索引重排

// 刪除末尾
$last = array_pop($arr);         // 返回被刪值

// 刪除開頭
$first = array_shift($arr);      // 索引重排

// 指定位置刪除/替換 (核心函數)
array_splice($arr, 1, 2, ['x', 'y']); // 從索引1刪2個,插入x,y
// 返回被刪除元素數組,原數組被修改

查找/檢測

<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 2];

in_array(2, $arr);              // true (值存在)
in_array(2, $arr, true);        // true (嚴格模式)

array_search(2, $arr);          // 'b' (返回第一個匹配的鍵)
array_keys($arr, 2);            // ['b', 'd'] (所有匹配的鍵)

array_key_exists('b', $arr);    // true (檢測鍵存在)
isset($arr['b']);               // true (鍵存在且非 null) — 更快

// 統計
count($arr);                    // 4
count($arr, COUNT_RECURSIVE);   // 遞歸計數多維數組

四、排序(核心:是否保持鍵值關聯、排序依據)

函數排序依據保持鍵值關聯順序返回值
sort()值❌ 重置索引升序bool
rsort()值❌降序bool
asort()值✅升序bool
arsort()值✅降序bool
ksort()鍵✅升序bool
krsort()鍵✅降序bool
natsort()值(自然排序)✅升序bool
usort()自定義回調(值)❌自定bool
uasort()自定義回調(值)✅自定bool
uksort()自定義回調(鍵)✅自定bool

自定義排序示例

<?php
$users = [
    ['name' => '張三', 'age' => 25],
    ['name' => '李四', 'age' => 30],
    ['name' => '王五', 'age' => 20],
];

// 年齡升序,保持鍵
uasort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// 太空船操作符 <=> (PHP 7+) 返回 -1, 0, 1

// 多字段排序:年齡升序,同齡按名字降序
uasort($users, fn($a, $b) => 
    [$a['age'], $b['name']] <=> [$b['age'], $a['name']]
);

五、數學統計

<?php
$nums = [10, 20, 30, 40, 50];

array_sum($nums);        // 150
array_product($nums);    // 12000000
min($nums);              // 10
max($nums);              // 50

// 統計值出現次數
$arr = ['a', 'b', 'a', 'c', 'b', 'a'];
array_count_values($arr); // ['a'=>3, 'b'=>2, 'c'=>1]

六、去重、交集、差集、合併

<?php
$a = [1, 2, 3, 4, 5];
$b = [4, 5, 6, 7, 8];

array_unique($a);              // [1,2,3,4,5] (保留首次出現鍵)
array_merge($a, $b);           // [1,2,3,4,5,4,5,6,7,8] (數字鍵重置)
$a + $b;                       // [1,2,3,4,5] (鍵不覆蓋,a優先)

array_intersect($a, $b);       // [4,5] (值交集,保留a的鍵)
array_diff($a, $b);            // [1,2,3] (a有b無)
array_diff_key($a, $b);        // 鍵差集
array_diff_assoc($a, $b);      // 鍵值對差集

七、遍歷與回調

<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];

// foreach (首選,性能最好)
foreach ($arr as $k => $v) { ... }

// array_map - 映射轉換 (返回新數組)
$upper = array_map('strtoupper', ['a', 'b', 'c']); // ['A','B','C']
$sum = array_map(fn($a, $b) => $a + $b, [1,2], [10,20]); // [11,22] 多數組

// array_filter - 過濾 (保留鍵)
$even = array_filter([1,2,3,4,5], fn($n) => $n % 2 === 0); // [2,4] 鍵保留1,3

// array_reduce - 歸約
$sum = array_reduce([1,2,3,4], fn($carry, $item) => $carry + $item, 0); // 10

// array_walk - 原地修改 (無返回值)
array_walk($arr, fn(&$v, $k) => $v *= 2); // $arr 變為 [2,4,6]

// array_column - 提取列 (極其高頻)
$users = [['id'=>1,'name'=>'張三'], ['id'=>2,'name'=>'李四']];
$names = array_column($users, 'name');        // ['張三','李四']
$map = array_column($users, 'name', 'id');    // [1=>'張三', 2=>'李四']

八、隨機與打亂

<?php
$arr = [1, 2, 3, 4, 5];

shuffle($arr);           // 原地打亂,鍵重置
array_rand($arr, 3);     // 返回 3 個隨機鍵
// PHP 7.1+ 使用 Mersenne Twister,質量更好

九、多維數組處理

<?php
// 遞歸遍歷
function walkRecursive(array $arr, callable $fn): void
{
    array_walk_recursive($arr, $fn);
}

// 扁平化
$multi = [[1,2], [3, [4,5]]];
$flat = [];
array_walk_recursive($multi, fn($v) => $flat[] = $v); // [1,2,3,4,5]

// 多維排序
$data = [
    ['name' => 'A', 'score' => 80],
    ['name' => 'B', 'score' => 90],
];
array_multisort(array_column($data, 'score'), SORT_DESC, $data);

十、現代 PHP 最佳實踐 (7.4+)

1. 箭頭函數簡化回調

$doubled = array_map(fn($n) => $n * 2, $nums);
$filtered = array_filter($items, fn($item) => $item->isActive());

2. 解包操作符合併數組

$merged = [...$arr1, ...$arr2];           // 數值索引重置
$mergedAssoc = [...$arr1, ...$arr2];      // 字符串鍵後者覆蓋
// 等價於 array_merge 但更快、語法更清晰

3. nullsafe 操作符配合數組訪問

$value = $data['user']['profile']['avatar'] ?? 'default.png';

4. 集合類庫替代原生數組 (大型項目)

// 使用 laravel/collections 或 illuminate/support
use Illuminate\Support\Collection;

$users = collect($rawUsers)
    ->filter(fn($u) => $u['active'])
    ->sortByDesc('score')
    ->take(10)
    ->keyBy('id')
    ->toArray();
// 鏈式調用、不可變、類型安全、可測試

性能優化口訣

  • 遍歷用 foreach,比 array_map/walk 快 2-3 倍
  • 查鍵用 isset,比 array_key_exists 快
  • 去重用 flip+flip:$arr = array_keys(array_flip($arr)) 比 array_unique 快 (大數據)
  • 合併用 + 或 ...,比 array_merge 快 (避免重建索引)
  • 大數據用生成器,避免一次性載入內存
  • 頻繁操作考慮 Collection,雖有微小開銷但 API 統一、可測試

常見陷阱避坑

| 陷阱 | 錯誤代碼 | 正確代碼 | 原因 | |------|----------|----------|------| | array_merge 重置數字鍵 | array_merge([5=>'a'], [6=>'b']) | [5=>'a'] + [6=>'b'] | array_merge 重新索引數字鍵 | | in_array 類型轉換陷阱 | in_array('abc', [0]) → true | in_array('abc', [0], true) | 非嚴格模式 'abc' == 0 為 true | | array_search 返回 0 被當作 false | if (array_search(...)) | if (array_search(...) !== false) | 索引 0 在弱類型判斷為 false | | shuffle 破壞關聯鍵 | shuffle($assocArr) | uksort($assocArr, fn() => rand(-1,1)) | shuffle 重置所有鍵 |

總結

PHP 數組函數庫極其豐富,核心掌握 分類認知 + 嚴格模式習慣 + 性能直覺 三要素:

  1. 按「創建、鍵值、增刪查、排序、統計、集合、遍歷、多維」分類建立心智地圖
  2. 養成 in_array(..., true)、array_search(...) !== false 嚴格模式習慣
  3. 大數據場景下直覺選擇 foreach、isset、flip+flip、生成器

熟練運用這些函數,能將數十行循環判斷代碼壓縮為一行聲明式表達,代碼更易讀、少 Bug、易優化。

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