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

PHP 陣列總覽:分類、宣告、多維陣列、索引與關聯陣列差異

     編輯:PHP 綜合知識

PHP 陣列完整體系解析

PHP 陣列是有序映射,同時支援索引陣列(數字鍵)與關聯陣列(字串鍵),並可巢狀形成多維陣列。掌握宣告方式、操作函數、內部實作特性,能寫出高效率程式碼。

一、陣列分類

類型鍵名特性範例
索引陣列連續整數 0,1,2...有序、可疊代、記憶體連續['a','b','c']
關聯陣列字串雜湊表查找 O(1)、無序(PHP 7+ 保持插入序)['name'=>'John', 'age'=>25]
混合陣列整數+字串兩者共存,鍵名不衝突[0=>'a', 'key'=>'b']
多維陣列陣列值為陣列樹狀結構、任意深度[['a','b'], ['c'=>'d']]

二、宣告方式

1. 短語法(PHP 5.4+ 推薦)

<?php
// 索引陣列
$fruits = ['apple', 'banana', 'orange'];

// 關聯陣列
$user = ['name' => 'John', 'age' => 30, 'active' => true];

// 多維陣列
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
];
$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
];

2. array() 函式(舊版相容)

$arr = array('a', 'b', 'c');
$assoc = array('key' => 'value', 'foo' => 'bar');

3. 動態賦值(自動建立鍵名)

$arr[] = 'first';  // 鍵 0
$arr[] = 'second'; // 鍵 1
$arr[10] = 'tenth'; // 鍵 10,下一個 [] 會是 11
$arr['custom'] = 'value'; // 字串鍵

4. 從其他來源建立

$lines = file('data.txt', FILE_IGNORE_NEW_LINES); // 檔案每行一元素
$fields = explode(',', 'a,b,c'); // 字串分割
$obj = (array) $object; // 物件轉陣列(屬性變鍵名)
$json = json_decode($jsonStr, true); // JSON 轉關聯陣列

三、核心操作函數速查

分類函數用途
新增/移除array_push / []推入尾部
array_unshift推入頭部
array_pop彈出尾部
array_shift彈出頭部
查找/篩選in_array值是否存在
array_search找值回傳鍵
array_filter回調過濾
array_column提取欄位
轉換/重組array_map逐元素映射
array_reduce歸約累積
array_merge合併陣列
array_combine鍵值陣列合併
排序sort / rsort值排序(重設鍵)
asort / arsort值排序(保持鍵)
ksort / krsort鍵排序

四、多維陣列常見操作

<?php
$users = [
    ['id' => 1, 'name' => 'Alice', 'scores' => [80, 90, 85]],
    ['id' => 2, 'name' => 'Bob', 'scores' => [70, 75, 80]],
];

// 提取所有名字
$names = array_column($users, 'name'); // ['Alice', 'Bob']

// 依分數平均排序
usort($users, function($a, $b) {
    $avgA = array_sum($a['scores']) / count($a['scores']);
    $avgB = array_sum($b['scores']) / count($b['scores']);
    return $avgB <=> $avgA; // 降冪
});

// 扁平化分數
$allScores = array_merge(...array_column($users, 'scores')); // [80,90,85,70,75,80]

// 搜尋 id=2 的使用者
$user = array_filter($users, fn($u) => $u['id'] === 2);
$user = array_values($user)[0] ?? null; // 重設索引取第一筆

五、效能與記憶體注意事項

  • 大量資料(10萬+)避免在迴圈中 array_push,預先配置大小或用 Generator 惰性產生。
  • in_array 大陣列效能差(O(n)),頻繁查找請改用 isset($arr[$key])(O(1))或翻轉鍵值 array_flip。
  • array_merge 會重設數字鍵,保留字串鍵(後者覆蓋前者),合併索引陣列用 + 運算子或 array_merge_recursive。
  • 參考傳遞 &$value 修改原陣列值,foreach ($arr as &$v) 迴圈結束後建議 unset($v) 避免殘留參考。

六、SPL 固定陣列

<?php
$fixed = new SplFixedArray(1000000); // 預先配置 100 萬元素,記憶體較陣列省 ~50%
$fixed[0] = 'first';
$fixed[999999] = 'last';
// 不支援字串鍵、動態擴展,但極大幅度降低記憶體

PHP 陣列功能強大且靈活,善用內建函數、理解內部實作(HashTable + 雙向鏈表),能在開發效率與執行效能間取得最佳平衡。

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