PHP 陣列實際上是有序映射,同時支援整數索引(類似 C++ vector)與字串鍵(類似 C++ map),且可混合使用。本文系統整理三大類型、多種宣告方式、遍歷技巧與多維陣列操作。
| 類型 | 別名 | 鍵值型態 | 對應 C++ 概念 |
|---|---|---|---|
| 索引陣列 | 數值陣列 | 整數(0 起) | std::vector |
| 關聯陣列 | 鍵值陣列 | 字串 | std::map<string, T> |
| 多維陣列 | 巢狀陣列 | 值為陣列 | vector<vector<T>> 或 map<string, vector<T>> |
// 自動分配索引
$names = ['Peter', 'Joe', 'Lily']; // PHP 5.4+ 短語法
$names = array('Peter', 'Joe', 'Lily'); // 傳統語法
// 手動指定索引
$names[0] = 'Peter';
$names[1] = 'Joe';
$names[2] = 'Lily';
// 存取
echo $names[0]; // Peter
// 宣告
$ages = ['Peter' => 32, 'Joe' => 30, 'Lily' => 28];
// 或
$ages['Peter'] = 32;
$ages['Joe'] = 30;
$ages['Lily'] = 28;
// 存取
echo "Peter is {$ages['Peter']} years old."; // Peter is 32 years old.
$families = [
'Griffin' => ['Peter', 'Lois', 'Megan'],
'Quagmire' => ['Glenn'],
'Brown' => ['Cleveland', 'Loretta', 'Junior'],
];
echo "Is {$families['Griffin'][2]} a part of the Griffin family?"; // Is Megan a part...
for 迴圈(僅適用索引陣列)$names = ['Peter', 'Joe', 'Lily'];
for ($i = 0, $len = count($names); $i < $len; $i++) {
echo $names[$i];
}
foreach(通用,推薦)// 僅需值
foreach ($names as $value) { echo $value; }
// 需要鍵值
foreach ($ages as $key => $value) { echo "$key: $value"; }
$wage = [
'市場部' => [
[1, '李某', '市場經理', 8000],
[2, '王某', '市場專員', 5000],
],
'產品部' => [
[1, '張某', '產品經理', 9000],
],
];
foreach ($wage as $dept => $staffList) {
echo "$dept 部門人員如下
";
foreach ($staffList as $staff) {
foreach ($staff as $field) {
echo $field . ' ';
}
echo '
';
}
}
| 功能 | 函式 | 說明 |
|---|---|---|
| 合併 | array_merge(), + 運算子 | 後者保留數值索引不重新排序 |
| 差集 | array_diff(), array_diff_key() | 比較值 / 比較鍵 |
| 交集 | array_intersect() | |
| 鍵值互換 | array_flip() | 值必須唯一 |
| 去重 | array_unique() | 保留首次出現的鍵 |
| 隨機取樣 | array_rand() | 回傳鍵 |
| 排序 | sort()/rsort(), asort()/arsort(), ksort()/krsort() | 值排序/鍵值排序/鍵排序 |
| 分塊 | array_chunk() | 分頁處理大陣列 |
| 欄位提取 | array_column() | PHP 5.5+,從多維陣列提取單欄 |
foreach ($arr as &$v) { $v *= 2; } unset($v); 最後 unset($v) 避免殘留參考污染後續迴圈。array_values() 重置索引;unset($arr[1]) 會留下索引斷層。$arr['1'] 與 $arr[1] 視為同一鍵;$arr['01'] 則不同。Generator 或分批 array_chunk 處理,避免一次載入耗盡 memory_limit。array_is_list() 判斷是否為列表(連續整數索引從 0 開始),配合 #[ArrayShape] 進行靜態分析。若需型別提示與 IDE 支援,可將陣列轉為 DTO 物件:
class UserDTO {
public function __construct(
public string $name,
public int $age,
public string $email,
) {}
}
$userArr = ['name' => 'Tom', 'age' => 25, 'email' => 'tom@example.com'];
$user = new UserDTO(...$userArr); // PHP 8.1+ 解包
// 或舊版:$user = new UserDTO($userArr['name'], $userArr['age'], $userArr['email']);
PHP 陣列功能強大且靈活,掌握其底層為有序映射的特性,善用 foreach、內建函式與型別系統,能寫出簡潔高效的資料處理代碼。下一步可探討 ArrayAccess, Iterator, Collection 等進階介面應用。