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

PHP 多維陣列完整指南:建立、存取、遍歷與實務應用

     編輯:PHP 入門

PHP 多維陣列完整指南

多維陣列是「陣列的陣列」,能以表格、樹狀、圖狀等結構組織複雜資料。PHP 靈活的陣列系統使多維結構建立與操作直觀強大。本文涵蓋建立方式、存取模式、遍歷技巧與實務應用。

基本概念

  • 二維陣列:每個元素為一維陣列,類似表格(行×列)
  • 三維以上:遞迴嵌套,適用樹狀選單、分類結構、矩陣運算
  • 鍵名類型:數值索引(0,1,2...)或關聯鍵('name', 'id'...)可混合

建立多維陣列

1. 短語法(PHP 5.4+)

<?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' => ['程式設計', '入門']]
    ]
];
?>

2. 動態建立

<?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' => ['棉質', '基礎款']
];
?>

遍歷多維陣列

1. 巢狀 foreach(最常用)

<?php
foreach ($users as $username => $info) {
    echo "<h3>$username</h3>";
    foreach ($info as $key => $value) {
        echo "$key: $value<br>";
    }
    echo "<hr>";
}
?>

2. 遞迴遍歷(任意深度)

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

3. array_walk_recursive(僅葉節點)

<?php
array_walk_recursive($catalog, function($value, $key) {
    echo "[$key] => $value\n";
});
/* 輸出所有標量值,忽略中間鍵名 */
?>

4. 產生器迭代(記憶體效率)

<?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) {
    // 處理扁平化後的鍵值對
}
?>

實務應用場景

1. 表單多筆資料處理

<!-- 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);
}
?>

2. 資料庫查詢結果分組

<?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]]
]
*/
?>

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 等現代函數,配合遞迴思維處理任意深度結構,能優雅解決複雜資料組織需求。

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