處理多層巢狀陣列時,需遞迴遍歷對所有字串值執行轉義。本文提供通用的遞迴轉義函數,適用於資料庫寫入前的資料清洗、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
)
)
)
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;
}
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;
}
RecursiveArrayIterator + RecursiveIteratorIterator)避免函數調用開銷。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 開發基本功,掌握通用遞迴模板能大幅減少重複造輪子。