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

PHP 遞歸處理多維陣列:字元替換實戰範例

     編輯:PHP 綜合知識

處理巢狀多維陣列時,遞歸是最直觀的工具。本文展示如何用遞歸函數遍歷任意深度的陣列,將特定字元(如 < >)替換為安全字元({ }),常用於防止 XSS 或格式化輸出。

核心遞歸函數

<?php
function arrContentReplace(array $array): array {
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            // 遞歸處理子陣列
            $array[$key] = arrContentReplace($value);
        } else {
            // 基礎情況:字串替換
            $array[$key] = str_replace(['<', '>'], ['{', '}'], $value);
        }
    }
    return $array;
}

完整執行範例

<?php
$arr = ['<小剛>', '<小曉>', '<小飛>', '<小李>', '<小紅>'];

$arr3 = arrContentReplace($arr);

echo '<pre>';
print_r($arr3);
echo '</pre>';

輸出結果

Array
(
    [0] => {小剛}
    [1] => {小曉}
    [2] => {小飛}
    [3] => {小李}
    [4] => {小紅}
)

進階版:支援任意回呼函數

將替換邏輯抽象為回呼,提升複用性:

function arrayMapRecursive(callable $callback, array $array): array {
    return array_map(function($value) use ($callback) {
        return is_array($value) ? arrayMapRecursive($callback, $value) : $callback($value);
    }, $array);
}

// 使用範例
$clean = arrayMapRecursive(function($v) {
    return htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
}, $inputArray);

遞歸 vs 迭代器(SPL)

PHP 5.3+ 可使用 RecursiveArrayIterator + RecursiveIteratorIterator 達成相同效果,記憶體效率更佳:

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($array),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($iterator as $key => $value) {
    // 僅處理葉子節點
    $iterator->getArrayCopy()[$key] = str_replace(['<', '>'], ['{', '}'], $value);
}

效能與注意事項

  • 深度限制:PHP 預設遞歸深度受 xdebug.max_nesting_level(預設 256)或記憶體限制約束,極深陣列可能導致堆疊溢位。
  • 引用修改:若需原地修改巨大陣列,傳遞參考 &$array 可避免複製開銷。
  • 型別檢查:嚴格檢查 is_array() 而非 is_object(),除非你實作 ArrayAccess 介面。

適用場景

  • 表單資料清理(htmlspecialchars、trim、stripslashes)
  • 多語系陣列值轉換
  • 配置檔案後處理
  • API 回應資料標準化

掌握遞歸陣列處理,是 PHP 開發者處理結構化資料的基本功。

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