PHP中htmlspecialchars为何移除数组键名?数据库数据清理问题
为什么使用htmlspecialchars处理关联数组后键名消失了?
你遇到的问题根源出在array_map的用法上——当你给它传递额外的数组参数时,它的行为和你预期的不一样。
先看你原代码里的这一行:
$data = array_map('htmlspecialchars', $data, array(ENT_QUOTES), array('UTF-8'));
你本来是想让htmlspecialchars处理$data里的每个元素时,都带上ENT_QUOTES和UTF-8这两个参数,但array_map的规则是:如果你传递多个数组,它会并行遍历所有数组,每次从每个数组里取一个元素,作为回调函数的参数。
这里你传递了三个数组参数:$data、array(ENT_QUOTES)、array('UTF-8')。后两个数组都只有1个元素,而$data作为关联数组有多个元素。更关键的是——当array_map接收多个数组参数时,它会返回索引数组,保留原键名的逻辑仅在传递单个数组时生效。这就是为什么你的关联数组变成了索引数组,键名全丢失了。
解决办法:用匿名函数包装htmlspecialchars
把这一行改成用匿名函数调用htmlspecialchars,这样既能给每个元素传递固定参数,又能保留原数组的键名:
$data = array_map(function($item) { return htmlspecialchars($item, ENT_QUOTES, 'UTF-8'); }, $data);
修改后,array_map只接收一个数组参数($data),它会保留原数组的键名,同时每个元素都能正确带上你需要的ENT_QUOTES和UTF-8参数进行处理。测试一下,处理后的数组就会和你预期的一样,依然是[ID => 4, IMAGE => header1.jpg, ...]这样的关联数组了。
内容的提问来源于stack exchange,提问作者Rajohan
相关产品推荐
相关产品推荐

