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

8 道 PHP 陣列面試題解析:從建立、運算到進階操作

     編輯:PHP 相關知識

PHP 陣列經典面試題 8 題詳解與最佳實作

陣列是 PHP 最核心的資料結構,面試高頻考點。本文精選 8 道涵蓋建立、搜尋、排序、合併、截取、逆序等操作的經典題目,提供標準解法與進階優化思路。

題目 1:建立等差奇數陣列

需求:長度 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
)
*/
?>

題目 2:建立等比數列陣列

需求:長度 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
)
*/
?>

題目 3:尋找最大值的鍵名

需求:回傳陣列中最大值對應的鍵 (若有多個回傳首個)

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

題目 4:建立費波那契數列陣列

需求:長度 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
)
*/
?>

題目 5:計算最大值與最小值差

需求:回傳 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
?>

題目 6:陣列循環右移 5 位

需求:長度 > 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() 重設數值鍵但保留字串鍵。

題目 7:合併兩個陣列

三種方式比較

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

題目 8:原地逆序陣列 (不可用 rsort、不可建新陣列)

需求:就地反轉,保留鍵名對應關係

<?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 開發者處理業務邏輯的基本功。

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