FormData传递数组时PHP端接收为逗号分隔字符串的问题求助
解决FormData发送数组到PHP时被扁平化的问题
嘿,这是FormData处理数组时很容易踩的一个小坑,我来帮你捋清楚问题所在和解决办法!
问题根源
你当前的代码里,当遇到数组类型的值时,直接把整个数组传给了fd.append():
fd.append(key, this.data.choices[section]);
FormData会自动把数组转换成逗号分隔的字符串,这就导致PHP接收到subjects时,把这个长字符串当成了数组的单个元素,而不是拆分多个元素。(你看到packages和usertypes看似正常,只是因为它们的数组只有一个元素,转成字符串后和单个元素没区别而已)
修复代码
你需要遍历数组中的每个元素,逐个调用append()方法,把每个元素单独添加到同一个带[]的key下:
let fd = new FormData(); for (const section in this.data.choices) { const value = this.data.choices[section]; if (Array.isArray(value)) { // 遍历数组元素,逐个追加到同一个key value.forEach(item => { fd.append(`${section}[]`, item); }); } else { fd.append(section, value); } } fetch('?get=plan', {method: 'post', body: fd}) // ...后续逻辑
为什么这样有效?
当你多次对同一个带[]的key调用append()时,PHP会自动把这些值解析为一个有序数组。这样处理后,你的$_POST输出就会变成符合预期的结构:
Array ( [mode] => o7ew4xqybwt [packages] => Array ( [0] => wx2xv1cakbe ) [usertypes] => Array ( [0] => s ) [subjects] => Array ( [0] => bxn5g1igm4l [1] => u1osgpv37fl [2] => q2scwqb27k7 [3] => fl9riri0wpr ) )
内容的提问来源于stack exchange,提问作者Mitya
相关产品推荐
相关产品推荐

