PHP 陣列 (Array)

陣列是用來儲存多個值的資料結構。PHP 陣列非常靈活,可以儲存不同型別的值,並且支援索引陣列和關聯陣列。

建立陣列

短語法(推薦)

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

// 關聯陣列
$person = [
    'name' => 'Alice',
    'age' => 25,
    'city' => 'Taipei'
];

// 空陣列
$empty = [];
?>

array() 函數

<?php
$fruits = array('apple', 'banana', 'orange');
$person = array('name' => 'Alice', 'age' => 25);
?>

索引陣列

索引陣列使用數字作為鍵,從 0 開始:

<?php
$fruits = ['apple', 'banana', 'orange'];

echo $fruits[0];  // apple
echo $fruits[1];  // banana
echo $fruits[2];  // orange

// 新增元素
$fruits[] = 'grape';        // 自動指派索引 3
$fruits[10] = 'kiwi';       // 指定索引 10

print_r($fruits);
// [0 => 'apple', 1 => 'banana', 2 => 'orange', 3 => 'grape', 10 => 'kiwi']
?>

關聯陣列

關聯陣列使用字串作為鍵:

<?php
$person = [
    'name' => 'Alice',
    'age' => 25,
    'city' => 'Taipei'
];

echo $person['name'];  // Alice
echo $person['age'];   // 25

// 新增/修改元素
$person['email'] = 'alice@example.com';
$person['age'] = 26;

print_r($person);
?>

多維陣列

陣列可以包含其他陣列:

<?php
// 二維陣列
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

echo $matrix[0][0];  // 1
echo $matrix[1][1];  // 5
echo $matrix[2][2];  // 9

// 關聯陣列的陣列
$users = [
    [
        'name' => 'Alice',
        'age' => 25
    ],
    [
        'name' => 'Bob',
        'age' => 30
    ]
];

echo $users[0]['name'];  // Alice
echo $users[1]['age'];   // 30
?>

存取元素

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

// 直接存取
echo $arr['a'];  // 1

// 存取不存在的鍵會產生警告
// echo $arr['d'];  // Warning

// 安全存取
echo $arr['d'] ?? 'default';  // default

// 檢查鍵是否存在
if (isset($arr['a'])) {
    echo $arr['a'];
}

if (array_key_exists('a', $arr)) {
    echo $arr['a'];
}
?>

修改陣列

<?php
$arr = ['apple', 'banana', 'orange'];

// 修改元素
$arr[1] = 'grape';

// 新增元素
$arr[] = 'kiwi';

// 刪除元素
unset($arr[0]);

// 重新索引
$arr = array_values($arr);

print_r($arr);
?>

陣列長度

<?php
$arr = [1, 2, 3, 4, 5];

echo count($arr);   // 5
echo sizeof($arr);  // 5(count 的別名)

// 多維陣列
$matrix = [[1, 2], [3, 4], [5, 6]];
echo count($matrix);                    // 3
echo count($matrix, COUNT_RECURSIVE);   // 9(遞迴計算)
?>

遍歷陣列

foreach

<?php
$fruits = ['apple', 'banana', 'orange'];

// 只取值
foreach ($fruits as $fruit) {
    echo $fruit . "\n";
}

// 取鍵和值
foreach ($fruits as $key => $fruit) {
    echo "$key: $fruit\n";
}

// 傳址修改
foreach ($fruits as &$fruit) {
    $fruit = strtoupper($fruit);
}
unset($fruit);

print_r($fruits);  // ['APPLE', 'BANANA', 'ORANGE']
?>

for

<?php
$arr = ['a', 'b', 'c'];

for ($i = 0; $i < count($arr); $i++) {
    echo $arr[$i] . "\n";
}
?>

常用陣列函數

新增和移除

<?php
$arr = [1, 2, 3];

// 尾端新增
$arr[] = 4;
array_push($arr, 5, 6);

// 開頭新增
array_unshift($arr, 0);

// 尾端移除
$last = array_pop($arr);

// 開頭移除
$first = array_shift($arr);

print_r($arr);
?>

搜尋

<?php
$arr = ['apple', 'banana', 'orange'];

// 檢查值是否存在
var_dump(in_array('banana', $arr));  // true

// 搜尋值的鍵
echo array_search('banana', $arr);  // 1

// 檢查鍵是否存在
var_dump(array_key_exists(0, $arr));  // true
?>

排序

<?php
$arr = [3, 1, 4, 1, 5, 9, 2, 6];

// 排序(會修改原陣列)
sort($arr);           // 升序
rsort($arr);          // 降序
asort($arr);          // 升序,保留鍵
arsort($arr);         // 降序,保留鍵
ksort($arr);          // 按鍵升序
krsort($arr);         // 按鍵降序

// 自訂排序
usort($arr, fn($a, $b) => $a <=> $b);
?>

合併和分割

<?php
$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];

// 合併
$merged = array_merge($arr1, $arr2);
// [1, 2, 3, 4, 5, 6]

// 展開運算子
$merged = [...$arr1, ...$arr2];

// 分割
$chunks = array_chunk([1, 2, 3, 4, 5], 2);
// [[1, 2], [3, 4], [5]]

// 切片
$slice = array_slice([1, 2, 3, 4, 5], 1, 3);
// [2, 3, 4]
?>

過濾和映射

<?php
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// 過濾
$evens = array_filter($numbers, fn($n) => $n % 2 === 0);
// [2, 4, 6, 8, 10]

// 映射
$doubled = array_map(fn($n) => $n * 2, $numbers);
// [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

// 歸約
$sum = array_reduce($numbers, fn($carry, $n) => $carry + $n, 0);
// 55
?>

解構賦值

<?php
$arr = [1, 2, 3];

// 陣列解構
[$a, $b, $c] = $arr;
echo "$a, $b, $c";  // 1, 2, 3

// 跳過元素
[, $second, ] = $arr;
echo $second;  // 2

// 關聯陣列解構
$person = ['name' => 'Alice', 'age' => 25];
['name' => $name, 'age' => $age] = $person;
echo "$name, $age";  // Alice, 25
?>

展開運算子

<?php
// 展開陣列
$arr1 = [1, 2, 3];
$arr2 = [...$arr1, 4, 5];  // [1, 2, 3, 4, 5]

// 函數參數展開
function add($a, $b, $c) {
    return $a + $b + $c;
}
echo add(...$arr1);  // 6

// PHP 8.1+:關聯陣列展開
$defaults = ['color' => 'red', 'size' => 'medium'];
$custom = ['color' => 'blue'];
$merged = [...$defaults, ...$custom];
// ['color' => 'blue', 'size' => 'medium']
?>

陣列與字串轉換

<?php
// 陣列轉字串
$arr = ['apple', 'banana', 'orange'];
$str = implode(', ', $arr);  // "apple, banana, orange"

// 字串轉陣列
$str = "apple,banana,orange";
$arr = explode(',', $str);  // ['apple', 'banana', 'orange']
?>

實際應用範例

處理表單資料

<?php
$_POST = [
    'name' => '  Alice  ',
    'email' => 'ALICE@EXAMPLE.COM',
    'age' => '25'
];

// 清理和驗證
$cleaned = array_map('trim', $_POST);
$cleaned['email'] = strtolower($cleaned['email']);
$cleaned['age'] = (int) $cleaned['age'];

print_r($cleaned);
?>

資料分組

<?php
$users = [
    ['name' => 'Alice', 'department' => 'IT'],
    ['name' => 'Bob', 'department' => 'HR'],
    ['name' => 'Charlie', 'department' => 'IT'],
    ['name' => 'David', 'department' => 'HR'],
];

// 按部門分組
$grouped = [];
foreach ($users as $user) {
    $grouped[$user['department']][] = $user;
}

print_r($grouped);
?>

建立查詢表

<?php
$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Charlie'],
];

// 建立 id => name 的對應
$lookup = array_column($users, 'name', 'id');
// [1 => 'Alice', 2 => 'Bob', 3 => 'Charlie']

echo $lookup[2];  // Bob
?>