處理巢狀陣列時,常需對所有字串值統一進行轉義或替換。遞迴函式能優雅地處理任意深度的多維結構,避免寫死層數。
<?php
/**
* 遞迴將陣列中所有字串的 < > 替換為 { }
*
* @param mixed $data 字串或陣列
* @return mixed 處理後的資料,結構不變
*/
function sanitizeBrackets(mixed $data): mixed
{
if (is_array($data)) {
foreach ($data as $key => $value) {
$data[$key] = sanitizeBrackets($value);
}
return $data;
}
// 純字串處理
return str_replace(['<', '>'], ['{', '}'], $data);
}
// 測試資料:三層巢狀陣列
$raw = [
'< 小剛>',
'< 小曉>',
[
'<小強>',
[
'<浪人>'
]
],
'< 小飛>',
'< 小李>',
'< 小紅>'
];
$clean = sanitizeBrackets($raw);
echo '<pre>';
print_r($clean);
echo '</pre>';
Array
(
[0] => { 小剛}
[1] => { 小曉}
[2] => Array
(
[0] => {小強}
[1] => Array
(
[0] => {浪人}
)
)
[3] => { 小飛}
[4] => { 小李}
[5] => { 小紅}
)
| 原則 | 說明 |
|---|---|
| 終止條件 | is_array() 為 false 時,直接處理純量值並回傳 |
| 遞迴步驟 | 遍歷陣列,對每個元素呼叫自身,並將回傳值寫回原鍵 |
| 引用傳遞 | 使用 $key => $value 並寫回 $data[$key],保持原陣列結構 |
| 型別安全 | PHP 8.0+ 可加 mixed 型別提示,支援字串、整數、null 等混合型別 |
function deepHtmlspecialchars(mixed $data): mixed
{
if (is_array($data)) {
return array_map('deepHtmlspecialchars', $data);
}
return is_string($data) ? htmlspecialchars($data, ENT_QUOTES, 'UTF-8') : $data;
}
array_walk_recursive() 內建函式效能略優於自訂遞迴。遞迴是處理樹狀、圖狀資料的利器。掌握「終止條件 → 遞迴拆解 → 結果合併」三步驟,即可輕鬆應對多維陣列轉換、目錄掃描、JSON 序列化等場景。