陣列是 PHP 最核心的資料結構,面試高頻考點。本文精選 8 道涵蓋建立、搜尋、排序、合併、截取、逆序等操作的經典題目,提供標準解法與進階優化思路。
需求:長度 10,首項 1,公差 2 的遞增奇數陣列
<?php
function createOddArray($length = 10, $first = 1) {
$arr = [];
for ($i = 0; $i < $length; $i++) {
$arr[] = $first + $i * 2;
}
return $arr;
}
print_r(createOddArray());
/*
Array (
[0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9
[5] => 11 [6] => 13 [7] => 15 [8] => 17 [9] => 19
)
*/
?>
需求:長度 10,首項 1,比值 3
<?php
function createGeoArray($length = 10, $first = 1, $ratio = 3) {
$arr = [];
$val = $first;
for ($i = 0; $i < $length; $i++) {
$arr[] = $val;
$val *= $ratio;
}
return $arr;
}
print_r(createGeoArray());
/*
Array (
[0] => 1 [1] => 3 [2] => 9 [3] => 27
[4] => 81 [5] => 243 [6] => 729 [7] => 2187
[8] => 6561 [9] => 19683
)
*/
?>
需求:回傳陣列中最大值對應的鍵 (若有多個回傳首個)
<?php
function maxKey($arr) {
if (empty($arr)) return null;
$maxVal = max($arr);
return array_search($maxVal, $arr, true); // 嚴格比較
}
$arr = [0, -1, -2, 5, 'b' => 15, 3];
echo maxKey($arr); // b
?>
進階:需所有最大值鍵名 → array_keys($arr, max($arr), true)
需求:長度 10,F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)
<?php
function fibonacciArray($len) {
if ($len <= 0) return [];
$arr = [0];
if ($len === 1) return $arr;
$arr[] = 1;
for ($i = 2; $i < $len; $i++) {
$arr[] = $arr[$i-1] + $arr[$i-2];
}
return $arr;
}
print_r(fibonacciArray(10));
/*
Array (
[0] => 0 [1] => 1 [2] => 1 [3] => 2 [4] => 3
[5] => 5 [6] => 8 [7] => 13 [8] => 21 [9] => 34
)
*/
?>
需求:回傳 max - min
<?php
function rangeDiff($arr) {
if (empty($arr)) return 0;
return max($arr) - min($arr); // 最簡潔
}
// 替代做法:排序後首尾相減 (效能較差 O(n log n))
function rangeDiffSort($arr) {
sort($arr);
return end($arr) - reset($arr);
}
echo rangeDiff([-1, -2, 100]); // 102
?>
需求:長度 > 10 的陣列,後 5 項移至前端,順序不變
<?php
function rotateRight5($arr) {
$len = count($arr);
if ($len <= 10) throw new InvalidArgumentException('Array length must > 10');
$offset = $len - 5;
return array_merge(
array_slice($arr, $offset, 5, true), // 保留鍵名
array_slice($arr, 0, $offset, true)
);
}
$arr = ['a'=>1, 2, 3, 8, 9, 6, 'b'=>5, -1, 'c'=>8, 0, 7];
print_r(rotateRight5($arr));
/*
Array (
[b] => 5 [0] => -1 [c] => 8 [1] => 0 [2] => 7
[a] => 1 [3] => 2 [4] => 3 [5] => 8 [6] => 9
[7] => 6
)
*/
?>
關鍵:array_slice(..., true) 保留原鍵名,array_merge() 重設數值鍵但保留字串鍵。
三種方式比較
<?php
$arr1 = ['a'=>1, 'b'=>2, 3];
$arr2 = ['a'=>'Dee', 3, 5];
// 1. array_merge():字串鍵後者覆蓋,數值鍵重設
print_r(array_merge($arr1, $arr2));
/* ['a'=>'Dee', 'b'=>2, 0=>3, 1=>3, 2=>5] */
// 2. array_merge_recursive():相同字串鍵合併為陣列
print_r(array_merge_recursive($arr1, $arr2));
/* ['a'=>[1,'Dee'], 'b'=>2, 0=>3, 1=>3, 2=>5] */
// 3. 手動迴圈:字串鍵衝突拋錯或自訂邏輯
function mergeCustom($a, $b) {
$result = $a;
foreach ($b as $k => $v) {
if (array_key_exists($k, $result)) {
throw new Exception("Duplicate key: $k");
}
$result[$k] = $v;
}
return $result;
}
?>
需求:就地反轉,保留鍵名對應關係
<?php
function reverseInPlace(&$arr) {
$len = count($arr);
$keys = array_keys($arr);
for ($i = 0; $i < $len / 2; $i++) {
$j = $len - 1 - $i;
// 交換值
$tmp = $arr[$keys[$i]];
$arr[$keys[$i]] = $arr[$keys[$j]];
$arr[$keys[$j]] = $tmp;
}
}
$arr = ['a', 'b', 'c', 1, 10];
reverseInPlace($arr);
print_r($arr);
/*
Array (
[0] => 10 [1] => 1 [2] => c [3] => b [4] => a
)
*/
?>
注意:若需保留鍵名不變只反轉值順序,上述做法正確;若需連鍵名一起反轉 (如 [4]=>a 變 [0]=>a),需用 array_reverse($arr, true) 但會建新陣列。
array_slice、array_merge、array_search、max/min 等內建函數true 參數)array_merge、+、array_merge_recursive 三者行為&$arr vs 回傳新陣列的設計取捨sort O(n log n) vs max/min O(n)掌握陣列核心操作與內建函數特性,是 PHP 開發者處理業務邏輯的基本功。