萬盛學電腦網

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

PHP 陣列操作函式大全(一):建立、遍歷、基礎操作與範圍產生

前言

陣列是 PHP 最核心、最靈活的資料結構,同時扮演列表、映射表、集合、堆疊、佇列等多種角色。本系列第一部分聚焦於陣列建立、遍歷與基礎操作,掌握這些基石,後續排序、過濾、轉換、聚合等進階操作才能得心應手。

一、陣列建立的三大方式

1. array() / [] 語法(最常用)

<?php
// 索引陣列(數字鍵名 0,1,2...)
$fruits = ['Apple', 'Banana', 'Cherry'];
// 等同於
$fruits = array('Apple', 'Banana', 'Cherry');

// 關聯陣列(字串鍵名)
$user = [
    'name' => 'Alice',
    'age' => 25,
    'city' => 'Taipei'
];

// 多維陣列
$users = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
];

// 短陣列語法(PHP 5.4+)已成標準,建議統一使用 []
?>

2. 直接指定鍵名賦值

<?php
$arr = [];
$arr[] = 'first';      // 自動索引 0
$arr[] = 'second';     // 自動索引 1
$arr[10] = 'tenth';    // 指定索引 10
$arr['key'] = 'value'; // 關聯鍵名

// 結果:[0=>'first', 1=>'second', 10=>'tenth', 'key'=>'value']
// 注意:整數鍵名會影響下一個自動索引(下一個為 11)
?>

3. range() 產生範圍陣列

<?php
// 數字範圍
$numbers = range(1, 10);        // [1,2,3,4,5,6,7,8,9,10]
$evens = range(2, 20, 2);       // 步長 2:[2,4,6,8,10,12,14,16,18,20]
$reverse = range(10, 1);        // 遞減:[10,9,8,7,6,5,4,3,2,1]

// 字元範圍(支援 ASCII 字元)
$letters = range('a', 'z');     // ['a','b',...,'z']
$upper = range('A', 'Z');       // 大寫字母
$hex = range('0', 'f');         // 0-9, :, ;, <, =, >, ?, @, A-F(含符號!)
// 純十六進位字元建議手動定義或過濾
?>

二、陣列遍歷:foreach 為王

各種遍歷模式

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

// 1. 鍵值對(最常用)
foreach ($data as $key => $value) {
    echo "$key: $value\n";
}

// 2. 僅需值
foreach ($data as $value) {
    echo "$value\n";
}

// 3. 需修改原陣列值:參考傳遞 &
foreach ($data as $key => &$value) {
    if (is_string($value)) $value = strtoupper($value);
}
unset($value); // 關鍵:解除參考!

// 4. 陣列解構(PHP 7.1+)
foreach ($users as ['name' => $name, 'age' => $age]) {
    echo "$name is $age years old\n";
}
?>

foreach 內部機制關鍵點

  • 遍歷的是陣列副本(PHP 7+ 為 Copy-on-Write,未修改時不複製)
  • 不影響內部指標(current(), next(), reset() 等)
  • 不可在遍歷中 unset($arr[$key]) 刪除當前元素(會導致跳過),需先收集鍵名再刪除

三、基礎操作函式速查

元素計數與檢查

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

count($arr);           // 3
count($arr, COUNT_RECURSIVE); // 遞迴計數多維陣列

is_array($arr);        // true
array_is_list($arr);   // PHP 8.1+ 判斷是否為列表(連續數字鍵 0...n)
// ['a','b'] => true, [1=>'a', 0=>'b'] => false, ['a'=>1] => false
?>

陣列合併與分割

<?php
$a = ['a' => 1, 'b' => 2];
$b = ['c' => 3, 'b' => 20]; // 相同鍵名:後者覆蓋

array_merge($a, $b);    // ['a'=>1, 'b'=>20, 'c'=>3] - 字串鍵名覆蓋,數字鍵名重新索引
$a + $b;                // ['a'=>1, 'b'=>2, 'c'=>3] - 聯合運算子:鍵名不覆蓋

// 分割
$chunk = array_chunk(range(1,10), 3); 
// [[1,2,3], [4,5,6], [7,8,9], [10]]

$slice = array_slice(['a','b','c','d','e'], 1, 3); 
// ['b','c','d'] (從索引1開始取3個)
?>

陣列鍵值翻轉與提取

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

array_flip($arr);     // [1 => 'c', 2 => 'b'] 值變鍵名,重複值後者勝出
array_keys($arr);     // ['a','b','c']
array_values($arr);   // [1,2,1] 重新索引
array_column($users, 'name', 'id'); // 多維陣列提取欄位建立映射
?>

搜尋與檢查

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

in_array('banana', $arr, true);        // true (嚴格模式)
array_search('banana', $arr, true);    // 1 (回傳鍵名)
array_key_exists('b', $arr);           // false (檢查鍵名)
isset($arr['b']);                      // false (且不檢查 null 值)

// 多值檢查
$allowed = ['admin', 'editor', 'author'];
$userRoles = ['editor', 'viewer'];
array_intersect($userRoles, $allowed); // ['editor'] 交集
array_diff($userRoles, $allowed);      // ['viewer'] 差集
?>

四、堆疊與佇列操作

陣列可直接作為堆疊或佇列使用:

<?php
$stack = [];
array_push($stack, 1, 2, 3); // [1,2,3]
array_pop($stack);           // 3, 剩 [1,2]

$queue = [];
array_push($queue, 1, 2, 3); // 入隊
array_shift($queue);         // 1 出隊,剩 [2,3]

// 更語意化的別名(PHP 7.3+)
$stack = [];
$stack[] = 1;  // array_push
array_pop($stack); // array_pop

$queue = [];
$queue[] = 1;  // 入隊
array_shift($queue); // 出隊
?>

五、實戰常用片段集錦

1. 移除陣列中所有 null/false/空字串

<?php
$data = [1, 0, '', 'text', null, false, [], 'keep'];
$filtered = array_filter($data, fn($v) => $v !== '' && $v !== null && $v !== false);
// [1, 0, 'text', 'keep'] 注意:0 保留,若要移除所有假值用無回呼 array_filter($data)
?>

2. 陣列去重(保留鍵名 vs 重新索引)

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

array_unique($arr);           // ['a','b','c'] 鍵名保留:[0=>'a', 1=>'b', 3=>'c']
array_values(array_unique($arr)); // ['a','b','c'] 重新索引 [0,1,2]
?>

3. 將陣列分組

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

$byDept = [];
foreach ($users as $user) {
    $byDept[$user['dept']][] = $user;
}
// 或 PHP 5.5+ array_column + 群組邏輯
?>

4. 扁平化多維陣列

<?php
$multi = [[1,2], [3,4], [5,6]];
$flat = array_merge(...$params); // PHP 7.4+ spread operator
// 或
$flat = [];
array_walk_recursive($multi, fn($v) => $flat[] = $v);
?>

六、陣列 vs 物件 vs Collection 選擇指南

場景推薦結構理由
簡單列表、配置、暫存資料陣列 []語法簡潔、內建函式豐富、序列化原生支援
領域模型、業務邏輯封裝Class / readonly class / DTO型別安全、IDE 支援、封裝不變條件
大量資料處理、鏈式操作、不可變Ds\Vector, Ds\Map, Laravel Collection效能優化、函式式 API、記憶體效率
固定結構、高效能、低記憶體SplFixedArrayC 級陣列、不可動態擴充但極快

結語

陣列是 PHP 的「瑞士刀」,熟練掌握建立、遍歷、合併、分割、搜尋、堆疊/佇列操作,是寫出簡潔高效代碼的基礎。下一篇將深入探討陣列排序、過濾、映射、歸約等函數式風格操作,以及多維陣列的進階處理技巧。

copyright © 萬盛學電腦網 all rights reserved