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

PHP 遞歸處理多維數組值並應用指定函數:function_deep 通用實現

     編輯:PHP 綜合知識

需求背景

WordPress 核心函數 stripslashes_deep 遞歸清理數組/對象/字符串中的斜杠。將其泛化為任意回調函數作用於任意嵌套結構的通用工具。

通用實現

<?php
function function_deep($callback, $value) {
    // 1. 回調可調用性檢查
    if (!is_callable($callback)) {
        throw new InvalidArgumentException("第一參數必須是可調用的回調");
    }

    // 2. 數組:遞歸映射
    if (is_array($value)) {
        // 構造同長度回調數組供 array_map 使用
        $callbacks = array_fill(0, count($value), $callback);
        return array_map('function_deep', $callbacks, $value);
    }

    // 3. 對象:遞歸處理屬性
    if (is_object($value)) {
        $vars = get_object_vars($value);
        foreach ($vars as $key => $data) {
            $value->{$key} = function_deep($callback, $data);
        }
        return $value;
    }

    // 4. 字符串:直接應用回調
    if (is_string($value)) {
        return call_user_func($callback, $value);
    }

    // 5. 其他類型(int/float/bool/null/resource)原樣返回
    return $value;
}

使用範例

<?php
$arr = [
    "I'm bean",
    "I'm bean",
    ["I'm bean", "I'm bean"],
    (object)["name" => "I'm bean", "meta" => ["I'm bean"]]
];

// 添加斜杠
$escaped = function_deep('addslashes', $arr);
print_r($escaped);

/* 輸出結構保持不變,所有字符串單引號被轉義:
Array
(
    [0] => I\'m bean
    [1] => I\'m bean
    [2] => Array
        (
            [0] => I\'m bean
            [1] => I\'m bean
        )
    [3] => stdClass Object
        (
            [name] => I\'m bean
            [meta] => Array
                (
                    [0] => I\'m bean
                )
        )
)
*/

支援的回調類型

類型示例
函數名字符串'addslashes', 'strtoupper', 'trim'
匿名函數function($v){ return htmlspecialchars($v, ENT_QUOTES); }
類靜態方法['MyClass', 'sanitize']
對象方法[$obj, 'clean']
箭頭函數fn($v) => str_replace(' ', '_', $v)

應用場景

  • 批量 htmlspecialchars 防 XSS 輸出
  • 遞歸 trim 清理用戶輸入首尾空白
  • 編碼轉換:iconv('GBK','UTF-8',$v) 整個數組
  • 敏感詞過濾、Emoji 轉義、JSON 序列化前處理

效能與遞歸深度

  • PHP 默認遞歸限制 xdebug.max_nesting_level=256(或 pcntl 相關),極深嵌套可能溢出
  • 超大數組建議改用迭代器 + 顯式棧非遞歸實現
  • 對象屬性遞歸會觸發 __get/__set 魔術方法,注意副作用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved