萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 陣列從入門到精通:建立、多維、操作、輸出完整實戰教學

陣列基礎概念

PHP 陣列實為**有序映射**,同時支援整數索引與字串鍵名,可作為列表、關聯陣列、雜湊表、堆疊、佇列使用。

建立陣列

<?php
// 短語法 (PHP 5.4+)
$arr = [];                    // 空陣列
$arr = ['a', 'b', 'c'];       // 索引陣列:0=>a, 1=>b, 2=>c
$arr = ['id' => 1, 'name' => 'John']; // 關聯陣列

// array() 函數 (所有版本)
$arr = array('a', 'b', 'c');
$arr = array('id' => 1, 'name' => 'John');

// 自動索引補充
$arr = [3 => 'a', 5 => 'b']; // 指定索引
$arr[] = 'c';                // 自動接在最大整數索引後 → 6 => 'c'

// 字串鍵名
$arr = ['user_name' => 'John', 'email' => 'john@example.com'];
echo $arr['user_name']; // John

多維陣列

<?php
// 二維陣列:使用者列表
$users = [
    ['id' => 1, 'name' => 'Alice', 'roles' => ['admin', 'editor']],
    ['id' => 2, 'name' => 'Bob',   'roles' => ['user']],
];

// 存取
echo $users[0]['name'];           // Alice
echo $users[1]['roles'][0];       // user

// 三維以上
$matrix = [
    [[1,2], [3,4]],
    [[5,6], [7,8]]
];
echo $matrix[1][0][1]; // 6

常用操作

新增/修改

$arr = [];
$arr[] = 'a';           // 推入末尾
$arr['key'] = 'value';  // 指定鍵名
$arr = array_merge($arr, ['x' => 1, 'y' => 2]); // 合併

刪除

unset($arr['key']);           // 刪除指定鍵
array_splice($arr, 1, 1);     // 刪除索引 1 並重新索引
array_shift($arr);            // 移除首元素並重新索引
array_pop($arr);              // 移除尾元素

查詢與檢查

isset($arr['key']);           // 鍵存在且非 null
array_key_exists('key', $arr); // 鍵存在 (含 null 值)
in_array('value', $arr);      // 值存在 (嚴格模式第3參數 true)
array_search('value', $arr);  // 回傳鍵名
array_keys($arr);             // 所有鍵名
array_values($arr);           // 所有值 (重新索引)

排序

$arr = [3, 1, 2];
sort($arr);          // [1,2,3] 重新索引
rsort($arr);         // [3,2,1]

$assoc = ['b'=>2, 'a'=>1, 'c'=>3];
ksort($assoc);       // 按鍵排序 ['a'=>1,'b'=>2,'c'=>3]
krsort($assoc);      // 反向
asort($assoc);       // 按值排序保留鍵
arsort($assoc);      // 反向

// 多維排序
usort($users, fn($a,$b) => $a['id'] <=> $b['id']); // 太空船運算子 PHP 7+
array_multisort(array_column($users, 'name'), SORT_ASC, $users);

迴圈遍歷

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

// foreach (最常用)
foreach ($arr as $key => $value) {
    echo "$key => $value\n";
}

// 參考修改
foreach ($arr as &$value) {
    $value *= 2;
}
unset($value); // 重要:解除參考,避免後續誤用

// while + each (舊式,不推薦)
while (list($key, $value) = each($arr)) { ... }

// array_walk (修改原陣列)
array_walk($arr, function(&$v, $k) { $v = strtoupper($v); });

// array_map (回傳新陣列)
$upper = array_map('strtoupper', $arr);

實戰範例:模擬資料庫查詢結果處理

<?php
// 模擬 SQL 查詢結果
$rawRows = [
    ['id' => 1, 'name' => 'Product A', 'price' => 100, 'category_id' => 10],
    ['id' => 2, 'name' => 'Product B', 'price' => 200, 'category_id' => 10],
    ['id' => 3, 'name' => 'Product C', 'price' => 150, 'category_id' => 20],
];

// 1. 分組:按分類整理
$byCategory = [];
foreach ($rawRows as $row) {
    $cid = $row['category_id'];
    $byCategory[$cid][] = $row;
}

// 2. 計算統計
$stats = [];
foreach ($byCategory as $cid => $products) {
    $stats[$cid] = [
        'count' => count($products),
        'total_price' => array_sum(array_column($products, 'price')),
        'avg_price' => array_sum(array_column($products, 'price')) / count($products),
        'products' => $products
    ];
}

// 3. 輸出 HTML
echo '<ul>';
foreach ($stats as $cid => $stat) {
    echo "<li>分類 $cid: {$stat['count']} 項, 平均價 {$stat['avg_price']}</li>";
    echo '<ul>';
    foreach ($stat['products'] as $p) {
        echo "<li>{$p['name']} - \${$p['price']}</li>";
    }
    echo '</ul>';
}
echo '</ul>';

進階技巧

陣列解構 (PHP 7.1+)

[$a, $b, $c] = [1, 2, 3]; // $a=1, $b=2, $c=3
['id' => $id, 'name' => $name] = ['id' => 1, 'name' => 'John']; // 關聯解構

// 忽略某些值
[, , $third] = [1, 2, 3]; // $third = 3

陣列合併與差集

$a = [1, 2, 3];
$b = [3, 4, 5];

array_merge($a, $b);     // [1,2,3,3,4,5] 保留重複
array_unique($a);        // 去重
array_diff($a, $b);      // [1,2] 在 a 不在 b
array_intersect($a, $b); // [3] 交集

常用陣列函數速查

功能函數說明
計數count()元素個數
翻轉array_flip()鍵值互換
反轉array_reverse()順序反轉
切片array_slice()取片段 (不重新索引加 true)
切割/替換array_splice()修改原陣列
欄位提取array_column()提取多維陣列單欄
鍵名轉小寫array_change_key_case()CASE_LOWER/CASE_UPPER
隨機取樣array_rand()取隨機鍵名
打亂shuffle()原地打亂

避坑指南

  • ❌ `echo $arr` → **錯誤**,陣列不可直接輸出,用 `print_r`、`var_dump`、`json_encode`
  • ❌ `foreach ($arr as $v) { $v = 1; }` → **不修改原陣列**,需 `&$v`
  • ❌ `unset($arr[1])` 後索引斷層 → JSON 輸出變物件,用 `array_values()` 重建
  • ❌ `array_merge` 數字索引會重新編號 → 若需保留索引用 `+` 運算子
  • ✅ 善用 `array_column`、`array_map`、`array_filter` 替代手寫迴圈

熟練掌握陣列操作,是 PHP 高效開發的核心技能之一。

copyright © 萬盛學電腦網 all rights reserved