使用本机函数array_walk_recursive() 可以轻松修改多维数组中的所有叶节点,因为它通过设计访问所有“叶节点”。
代码:(Demo)(或as an anonymous one-liner)
$sweet = ['a' => 'apple ', 'b' => ' "banana" '];
$array = ['sweet' => $sweet, 'test' => " <a href='test'>Test</a>"];
function mySanitizer(&$value) {
$value = htmlspecialchars(trim($value));
}
array_walk_recursive($array, 'mySanitizer');
var_export($array);
输出:
array (
'sweet' =>
array (
'a' => 'apple',
'b' => '"banana"',
),
'test' => '<a href=\'test\'>Test</a>',
)
注意在 value 参数上使用 &。这告诉脚本通过引用来修改数据——否则不会在array_walk_recursive范围之外进行任何更改
如何应用这种技术...
要将此技术应用于$_POST 超全局数组中的所有元素,请调用:
array_walk_recursive($_POST, 'mySanitizer');
当然,这需要您编写自定义函数声明 (function mySanitizer() {...})。
或者,如果您不想声明自定义函数mySanitizer,那么您只需编写以下代码:
array_walk_recursive($_POST, function(&$value){
$value = htmlspecialchars(trim($value));
});
大多数函数都有return 值更为常见,但是array_walk_recursive() 不提供返回数据。要使此函数有效满足您的要求,输入数组必须直接受其包含的自定义函数的影响。 “通过引用修改变量”意味着您不需要通过赋值覆盖$_POST 变量(如$_POST = ...)。只需将输入数组输入到本机函数中,在$value 参数之前写入&,然后在迭代时覆盖每个遇到的$value,您的$_POST 变量就会被清理。
至于array_walk_recursive()“迭代/循环”......有一个特殊的行为可以享受。该函数将遍历数组的每一层。如果它找到一个“可迭代”元素,它将遍历它包含的元素。如果遇到不可迭代的元素(标量元素可能是字符串、整数、浮点数、布尔值、null),它将在其上执行一个函数/回调(无论你命令它做什么)。
另一个通过引用修改的 php 函数示例是 sort()。你不用这个函数进行赋值,你只是通过它传递你的数据,当你下次访问变量的数据时,它已经被修改了。