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

PHP 陣列核心操作完整指南:建立、遍歷、多維、常用函數與效能技巧

     編輯:PHP 相關知識

前言

陣列是 PHP 最核心、最靈活的資料結構,同時扮演有序映射(Hash Table)與列表雙重角色。熟練掌握陣列建立、遍歷、操作函數與效能特性,是寫出高效 PHP 代碼的關鍵。

一、陣列建立與分類

1.1 索引陣列(索引自動遞增)


$arr = [1, 2, 3, 4, 5];           // 短語法 PHP 5.4+
$arr = array(1, 2, 3, 4, 5);      // 傳統語法
// 索引:0,1,2,3,4

1.2 關聯陣列(字串鍵名)


$arr = [
    'name' => '張三',
    'age' => 25,
    'city' => '台北'
];
// 索引:'name', 'age', 'city'

1.3 混合陣列(同時擁有數值與字串鍵)


$arr = [10, 'name' => '李四', 20];
// 索引:0, 'name', 1

1.4 多維陣列


$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];
$users = [
    ['id' => 1, 'name' => 'A'],
    ['id' => 2, 'name' => 'B']
];

二、陣列輸出除錯

函數特點適用場景
print_r()易讀格式,不顯示型別快速除錯
var_dump()顯示型別、長度、參考深度除錯
var_export()輸出合法 PHP 代碼快取導出、配置檔生成
json_encode()JSON 格式,前端互通API 回傳、日誌記錄

三、遍歷方式比較

3.1 foreach(最常用、支援引用修改)


// 僅值
foreach ($arr as $value) { ... }

// 鍵值
foreach ($arr as $key => $value) { ... }

// 修改原陣列值(引用)
foreach ($arr as &$value) {
    $value *= 2;
}
unset($value); // 重要:解除引用,避免後續汙染

3.2 for 迴圈(需連續數值索引)


for ($i = 0, $len = count($arr); $i < $len; $i++) {
    echo $arr[$i];
}

3.3 while + each/list(舊式,不推薦)


while (list($key, $value) = each($arr)) { ... }
// PHP 7.2+ 棄用 each()

3.4 內部指標操作(罕見需求)


reset($arr);      // 指標指首
next($arr);       // 下一個
prev($arr);       // 上一個
end($arr);        // 指尾
key($arr);        // 當前鍵
current($arr);    // 當前值

四、常用陣列函數分類速查

4.1 增刪改


// 新增
$arr[] = 'new';           // 追加數值索引
$arr['key'] = 'value';    // 指定鍵名
array_push($arr, 'a', 'b'); // 批次追加
array_unshift($arr, 'first'); // 開頭插入

// 刪除
unset($arr['key']);       // 指定鍵(不重排索引)
array_shift($arr);        // 移除首元素(重排數值索引)
array_pop($arr);          // 移除尾元素
array_splice($arr, 1, 2); // 位置 1 刪除 2 個

// 修改
$arr['key'] = 'newval';

4.2 排序

函數排序依據鍵名保留順序
sort()值❌ 重排 0..n升序
rsort()值❌降序
asort()值✅升序
arsort()值✅降序
ksort()鍵✅升序
krsort()鍵✅降序
usort()自訂比較❌自訂
uasort()自訂比較✅自訂
uksort()自訂比較鍵✅自訂

自然排序:natsort()、natcasesort()(人類直覺:img2 < img10)

4.3 查找與檢查


in_array($needle, $arr, true);       // 嚴格模式建議 true
array_search($needle, $arr, true);   // 回傳鍵名,找不到 false
array_key_exists('key', $arr);       // 檢查鍵存在(含 null 值)
isset($arr['key']);                  // 鍵存在且非 null(較快)
isset($arr['a']['b']['c']);          // 多層安全檢查

4.4 統計與計算


count($arr);           // 元素個數(遞迴模式 COUNT_RECURSIVE)
sizeof($arr);          // count 別名
array_sum($arr);       // 數值加總
array_product($arr);   // 數值乘積
array_count_values($arr); // 值出現次數統計

4.5 合併、分割、交集、差集


array_merge($a, $b);           // 合併(數值鍵重排,字串鍵後覆蓋前)
$a + $b;                       // 聯集(字串鍵優先保留 $a)
array_combine($keys, $values); // 兩陣列組成關聯陣列
array_slice($arr, 0, 3);       // 切片(保留鍵名需第 4 參數 true)
array_chunk($arr, 2);          // 分塊
array_intersect($a, $b);       // 交集(比較值)
array_diff($a, $b);            // 差集($a 有 $b 無)

4.6 陣列與變數互轉


extract($arr);           // 陣列鍵變變數(需慎用,建議 EXTR_PREFIX_ALL)
compact('a', 'b', 'c');  // 變數組成陣列
list($a, $b) = $arr;     // 解包賦值(PHP 7.1+ 支援鍵名)

五、多維陣列操作技巧

5.1 多維遍歷


foreach ($users as &$user) {
    $user['name'] = strtoupper($user['name']);
}
unset($user);

5.2 指定欄位排序


usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// 或
array_multisort(array_column($users, 'age'), SORT_ASC, $users);

5.3 欄位提取


$names = array_column($users, 'name');        // ['A', 'B']
$map = array_column($users, 'name', 'id');    // [1 => 'A', 2 => 'B']

六、效能與記憶體優化

6.1 避免在迴圈中 count()


// 慢
for ($i = 0; $i < count($arr); $i++) { ... }
// 快
$len = count($arr);
for ($i = 0; $i < $len; $i++) { ... }

6.2 大陣列用生成器迭代


function largeDataGenerator() {
    for ($i = 0; $i < 1000000; $i++) {
        yield $i => $i * 2;
    }
}
foreach (largeDataGenerator() as $k => $v) { ... }
// 記憶體 O(1) 而非 O(n)

6.3 參考傳遞避免複製


function process(&$bigArray) { ... } // 傳參考
process($hugeArray);

6.4 釋放大陣列記憶體


unset($hugeArray);
// 或
$hugeArray = null;
// 觸發 GC 回收(PHP 7+ 即時釋放)

七、常見陷阱與最佳實踐

陷阱說明正確做法
foreach 引用殘留迴圈後 $value 仍為引用迴圈後 unset($value)
in_array 嚴格模式預設鬆散比較 '1' == 1第三參數 true
array_merge 數值鍵重排0,1,2 重新索引用 + 運算子保留鍵
isset vs array_key_existsisset 對 null 回傳 false需區分「無鍵」與「值為 null」用 array_key_exists
陣列鍵型別轉換'1' (string) == 1 (int)刻意使用字串鍵避免隱性轉型

八、進階:ArrayAccess / Iterator / Countable 介面

使物件可像陣列操作:


class Collection implements ArrayAccess, Iterator, Countable {
    private $data = [];
    // 實作 offsetGet/Set/Exists/Unset
    // 實作 current/key/next/rewind/valid
    // 實作 count()
}
$c = new Collection();
$c['key'] = 'value';
foreach ($c as $k => $v) { ... }
echo count($c);

小結

PHP 陣列功能極其豐富,核心建議:

  1. 優先使用 [] 短語法與 foreach
  2. 排序選對函數(保留鍵用 a/k/ua/uk 系列)
  3. 大資料集用 yield 生成器避免記憶體爆炸
  4. 嚴格比較習慣加 true 參數
  5. 善用 array_column、array_multisort 處理多維資料
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved