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

PHP 多維陣列遞迴轉義實作:addslashes 深度應用

     編輯:PHP 相關知識

PHP 多維陣列遞迴轉義實作:addslashes 深度應用

處理多層巢狀陣列時,需遞迴遍歷對所有字串值執行轉義。本文提供通用的遞迴轉義函數,適用於資料庫寫入前的資料清洗、JSON 編碼前處理等場景。

一、核心實作

<?php
$arr = array('a"aa', array("c'd", array('e"f')));

function changes($arr) {
    foreach ($arr as $k => $v) {
        if (is_string($v)) {
            $arr[$k] = addslashes($v);
        } elseif (is_array($v)) {
            $arr[$k] = changes($v); // 遞迴處理子陣列
        }
    }
    return $arr;
}

print_r(changes($arr));
?>

二、輸出結果

Array
(
    [0] => a\"aa
    [1] => Array
        (
            [0] => c\'d
            [1] => Array
                (
                    [0] => e\"f
                )
        )
)

三、進階變體:鍵名轉義、HTML 實體編碼

1. 同時轉義鍵名與值

function deep_escape($data) {
    if (is_string($data)) return addslashes($data);
    if (!is_array($data)) return $data;
    $result = array();
    foreach ($data as $k => $v) {
        $result[addslashes($k)] = deep_escape($v);
    }
    return $result;
}

2. HTML 實體編碼版(防 XSS)

function deep_htmlspecialchars($data) {
    if (is_string($data)) return htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
    if (!is_array($data)) return $data;
    foreach ($data as $k => $v) {
        $data[$k] = deep_htmlspecialchars($v);
    }
    return $data;
}

四、效能考量

  • 遞迴深度過大(> 1000 層)可能觸發堆疊溢出,極少見於正常業務資料。
  • 大量資料建議改用迭代器(RecursiveArrayIterator + RecursiveIteratorIterator)避免函數調用開銷。
  • PHP 7+ 陣列複製優化(Copy-on-Write)使傳值調用效能可接受。

五、常見問題延伸

二維陣列值修改遞迴寫法

public function check($result, $arr, $r) {
    $re = $r;
    foreach ($result as $value) {
        if ($arr[$re]['name'] == $value['name'] || $arr[$re]['uid'] == $value['uid']) {
            $re++;
            $this->check($result, $arr, $re); // 遞迴檢查下一個
        }
    }
    return $re;
}

多維陣列鍵名重組為關聯陣列

$b = array();
foreach ($a as $k => $v) {
    $b[intval($v['id'])] = $v['unit_name'];
}
$a = $b; // $a 現在是 id => unit_name 的關聯陣列

遞迴處理巢狀資料結構是 PHP 開發基本功,掌握通用遞迴模板能大幅減少重複造輪子。

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