多維陣列是「陣列的陣列」,能以表格、樹狀、圖狀等結構組織複雜資料。PHP 靈活的陣列系統使多維結構建立與操作直觀強大。本文涵蓋建立方式、存取模式、遍歷技巧與實務應用。
<?php
// 二維數值索引
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// 二維關聯索引
$users = [
'john' => ['email' => 'john@example.com', 'age' => 28, 'role' => 'admin'],
'jane' => ['email' => 'jane@example.com', 'age' => 24, 'role' => 'user'],
'bob' => ['email' => 'bob@example.com', 'age' => 35, 'role' => 'editor']
];
// 三維:分類 → 產品 → 屬性
$catalog = [
'electronics' => [
'phone' => ['price' => 29999, 'stock' => 50, 'tags' => ['5G', '旗艦']],
'laptop' => ['price' => 45999, 'stock' => 20, 'tags' => ['輕薄', '高效能']]
],
'books' => [
'php_guide' => ['price' => 600, 'stock' => 100, 'tags' => ['程式設計', '入門']]
]
];
?>
<?php
$students = [];
for ($i = 1; $i <= 30; $i++) {
$students[] = [
'id' => $i,
'name' => "學生$i",
'scores' => [
'math' => rand(60, 100),
'eng' => rand(60, 100),
'ch' => rand(60, 100)
]
];
}
?>
<?php
// 數值索引
echo $matrix[1][2]; // 6 (第2行第3列)
// 關聯索引
echo $users['jane']['email']; // jane@example.com
// 三維
echo $catalog['electronics']['phone']['price']; // 29999
// 安全存取(PHP 7+ nullsafe 操作符 PHP 8+)
$price = $catalog['electronics']['tablet']['price'] ?? '無此商品';
// PHP 8: $catalog['electronics']['tablet']['price'] ??= '預設值';
?>
<?php
// 修改現有
$users['john']['age'] = 29;
// 新增子陣列元素
$users['john']['last_login'] = '2024-01-15 10:30:00';
// 新增整行
$users['alice'] = [
'email' => 'alice@example.com',
'age' => 22,
'role' => 'user'
];
// 多維新增
$catalog['clothing']['tshirt'] = [
'price' => 499,
'stock' => 200,
'tags' => ['棉質', '基礎款']
];
?>
<?php
foreach ($users as $username => $info) {
echo "<h3>$username</h3>";
foreach ($info as $key => $value) {
echo "$key: $value<br>";
}
echo "<hr>";
}
?>
<?php
function printArray($array, $indent = 0) {
$prefix = str_repeat(' ', $indent);
foreach ($array as $key => $value) {
if (is_array($value)) {
echo "$prefix[$key] => Array\n";
printArray($value, $indent + 1);
} else {
echo "$prefix[$key] => $value\n";
}
}
}
printArray($catalog);
?>
<?php
array_walk_recursive($catalog, function($value, $key) {
echo "[$key] => $value\n";
});
/* 輸出所有標量值,忽略中間鍵名 */
?>
<?php
function flattenArray($array) {
foreach ($array as $key => $value) {
if (is_array($value)) {
yield from flattenArray($value);
} else {
yield $key => $value;
}
}
}
foreach (flattenArray($catalog) as $key => $value) {
// 處理扁平化後的鍵值對
}
?>
<!-- HTML -->
<input name="products[0][name]">
<input name="products[0][price]">
<input name="products[1][name]">
<input name="products[1][price]">
<?php
// $_POST['products'] 直接為二維陣列
foreach ($_POST['products'] as $product) {
// 驗證並儲存
Product::create($product);
}
?>
<?php
// 假設查詢訂單含商品明細
$rows = [
['order_id' => 1, 'product' => 'A', 'qty' => 2],
['order_id' => 1, 'product' => 'B', 'qty' => 1],
['order_id' => 2, 'product' => 'A', 'qty' => 3],
];
$orders = [];
foreach ($rows as $row) {
$orders[$row['order_id']][] = [
'product' => $row['product'],
'qty' => $row['qty']
];
}
/*
$orders = [
1 => [['product'=>'A','qty'=>2], ['product'=>'B','qty'=>1]],
2 => [['product'=>'A','qty'=>3]]
]
*/
?>
<?php
return [
'database' => [
'default' => 'mysql',
'connections' => [
'mysql' => [
'host' => 'localhost',
'port' => 3306,
'database' => 'myapp',
'username' => 'user',
'password' => 'secret',
'charset' => 'utf8mb4',
],
'pgsql' => [ ... ]
]
],
'cache' => [
'default' => 'redis',
'stores' => [
'redis' => ['host' => '127.0.0.1', 'port' => 6379],
'file' => ['path' => storage_path('cache')]
]
]
];
?>
| 函數 | 用途 | 範例 |
|---|---|---|
| array_column | 提取欄位 | array_column($users, 'email') → 所有 email |
| array_map | 逐元素轉換 | array_map(fn($u) => $u['name'], $users) |
| array_filter | 條件過濾 | array_filter($users, fn($u) => $u['role'] === 'admin') |
| array_reduce | 聚合計算 | array_reduce($users, fn($c,$u)=>$c+$u['age'], 0) → 總年齡 |
| array_search | 搜尋鍵名 | 需配合遞迴或 array_column |
| in_array | 搜尋值 | 需遞迴搜尋多維 |
<?php
function deepSearch($array, $needle, $strict = false) {
foreach ($array as $key => $value) {
if (is_array($value)) {
$result = deepSearch($value, $needle, $strict);
if ($result !== false) return [$key, ...$result];
} elseif (($strict ? $value === $needle : $value == $needle)) {
return [$key];
}
}
return false;
}
$path = deepSearch($catalog, 'PHP指南');
// ['books', 'php_guide', 'tags', 0]
?>
$index = array_column($data, null, 'id')unset() 釋放不再需要的參考&$arr 或物件封裝)多維陣列是 PHP 處理結構化資料的利器。善用短語法、foreach 遍歷、array_column 等現代函數,配合遞迴思維處理任意深度結構,能優雅解決複雜資料組織需求。