處理巢狀多維陣列時,遞歸是最直觀的工具。本文展示如何用遞歸函數遍歷任意深度的陣列,將特定字元(如 < >)替換為安全字元({ }),常用於防止 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);
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);
}
xdebug.max_nesting_level(預設 256)或記憶體限制約束,極深陣列可能導致堆疊溢位。&$array 可避免複製開銷。is_array() 而非 is_object(),除非你實作 ArrayAccess 介面。htmlspecialchars、trim、stripslashes)掌握遞歸陣列處理,是 PHP 開發者處理結構化資料的基本功。