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
?>