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

PHP 陣列完整指南:定義、分類、多維結構與實務操作

     編輯:PHP 綜合知識

陣列是 PHP 最強大、最常用的資料結構,同時扮演列表、映射、集合、堆疊、佇列等角色。本文系統整理陣列定義方式、索引/關聯/多維分類、核心操作與現代最佳實踐。

一、陣列本質與分類

  • 有序映射:鍵為 int 或 string,值為任意型別,保持插入順序。
  • 索引陣列:鍵為連續整數 0, 1, 2...(列表語意)。
  • 關聯陣列:鍵為字串(字典/映射語意)。
  • 混合陣列:同時包含整數與字串鍵,PHP 允許但不建議,語意模糊。

二、定義語法

1. 短陣列語法 [](PHP 5.4+,推薦)

$indexed = [1, 'zhangsan', 10, 'nan'];
$assoc   = ['id'=>1, 'name'=>'zhangsan', 'age'=>10, 'sex'=>'nan'];
$mixed   = [0 => 'a', 'key' => 'b', 5 => 'c']; // 避免

2. array() 傳統語法

$indexed = array(1, 'zhangsan', 10, 'nan');
$assoc   = array('id'=>1, 'name'=>'zhangsan', 'age'=>10, 'sex'=>'nan');

3. 直接賦值(動態建立)

$user = [];
$user[] = 1;        // 自動索引 0
$user[] = 'zhangsan';
$user['id'] = 100;  // 指定字串鍵
$user[5] = 'gap';   // 下一個自動索引為 6

三、多維陣列(巢狀結構)

1. 二維陣列:多筆記錄

$users = [
    ['id'=>1, 'name'=>'zhangsan', 'age'=>10, 'sex'=>'nan'],
    ['id'=>2, 'name'=>'lisi',     'age'=>20, 'sex'=>'nv'],
    ['id'=>3, 'name'=>'wangwu',   'age'=>30, 'sex'=>'nan'],
];

// 存取
echo $users[1]['name']; // lisi
echo $users[2]['age'];  // 30

2. 三維陣列:多表多筆記錄

$database = [
    'user' => [
        ['id'=>1, 'name'=>'zhangsan', 'age'=>10, 'sex'=>'nan'],
        ['id'=>2, 'name'=>'lisi',     'age'=>20, 'sex'=>'nv'],
    ],
    'score' => [
        ['user_id'=>1, 'chinese'=>90, 'math'=>80, 'english'=>70],
        ['user_id'=>2, 'chinese'=>60, 'math'=>40, 'english'=>70],
    ],
    'contact' => [
        ['user_id'=>1, 'phone'=>'110', 'email'=>'aaa@bbb.com'],
        ['user_id'=>2, 'phone'=>'120', 'email'=>'bbb@ccc.com'],
    ],
];

echo $database['score'][1]['chinese']; // 60

四、核心操作速查

操作函數/語法備註
新增元素$arr[] = $val / array_push()索引自動遞增
指定鍵新增/修改$arr['key'] = $val覆蓋既有鍵
刪除元素unset($arr['key'])不重新索引
刪除並重新索引array_splice($arr, $offset, $len)類似 JS splice
合併陣列array_merge($a, $b)字串鍵後者覆蓋,數字鍵重新索引
遞迴合併array_merge_recursive()相同字串鍵合併為陣列
去重array_unique($arr)保留首次出現,保持鍵
翻轉鍵值array_flip($arr)值必須為 int/string
取得所有鍵array_keys($arr)
取得所有值array_values($arr)重新索引 0...
搜尋值對應鍵array_search($val, $arr, true)第三參數 true 嚴格比較
檢查鍵存在array_key_exists('key', $arr) / isset($arr['key'])isset 若值為 null 回傳 false
檢查值存在in_array($val, $arr, true)嚴格模式建議開啟

五、陣列指標操作(舊式,了解即可)

current(), key(), next(), prev(), reset(), end(), each()(已棄用)。

現代寫法:foreach ($arr as $k => $v)、array_keys()、array_values()。

六、實務範例:CSV 匯入轉陣列

function csvToArray(string $path): array {
    $rows = [];
    if (($handle = fopen($path, 'r')) !== false) {
        $headers = fgetcsv($handle);
        while (($row = fgetcsv($handle)) !== false) {
            $rows[] = array_combine($headers, $row);
        }
        fclose($handle);
    }
    return $rows;
}

$users = csvToArray('users.csv');
// [['id'=>'1','name'=>'Alice',...], ...]

七、效能與記憶體考量

場景建議
百萬級元素用 Generator 逐行處理,避免一次載入
頻繁 in_array 查詢改用 array_flip 後 isset($flipped[$val]) O(1)
大量 array_push$arr[] = $val 語法更快
固定結構大量資料考慮 SplFixedArray 節省記憶體

八、常見錯誤對照

錯誤程式碼問題修正
$arr = [1,2]; echo $arr[2];索引越界isset($arr[2]) 先檢查
unset($arr); echo $arr[0];銷毀整個陣列unset($arr[0]) 刪除單元素
array_merge([1,2], [3,4]) 鍵重置數字鍵重新索引需保留鍵用 + 運算子:[0=>1] + [2=>3]
in_array('0', [false]) 為 true鬆散比較in_array('0', [false], true)
$arr = [1,2]; foreach($arr as &$v) {} foreach($arr as $v) {}參考殘留汙染首輪 unset($v) 或改用索引賦值

總結:陣列是 PHP 的瑞士刀。掌握 [] 短語法、索引/關聯語意區分、多維巢狀結構、核心增刪改查函數、foreach 遍歷與參考陷阱,即能駕馭 90% 以上的資料處理場景。大規模資料請善用 Generator、SplFixedArray 或資料庫游標。

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