JSON值多次编码及PHP生成JSON数组重复值问题求助
如何对JSON值进行多次编码?
其实对JSON值进行多次编码没什么复杂的,就是反复调用PHP的json_encode()函数就行,但得搞清楚每次编码的实际效果:
- 第一次调用会把PHP的变量(比如数组、对象)转换成标准的JSON格式字符串;
- 第二次调用会把这个JSON字符串再转义一遍,变成一个可以直接作为JSON值的字符串;
- 后续每多调用一次,就会多一层转义嵌套。
给你举个直观的代码例子:
// 原始的PHP数组 $base_data = ['color' => 'Red', 'typename' => 'ColorChase']; // 第一次编码:得到正常的JSON字符串 $first_pass = json_encode($base_data); // 输出结果:{"color":"Red","typename":"ColorChase"} // 第二次编码:把JSON字符串转义后变成新的JSON字符串 $second_pass = json_encode($first_pass); // 输出结果:"{\"color\":\"Red\",\"typename\":\"ColorChase\"}" // 如果需要更多次编码,接着调用json_encode()就好 $third_pass = json_encode($second_pass);
这种操作一般只用在特殊场景里,比如你需要把一段JSON字符串作为另一个JSON结构的字符串值来存储的时候。
解决PHP生成JSON时animations数组仅保留最后一个值的问题
你遇到的这个问题,十有八九是构建数组的方式错了——应该是每次循环都直接覆盖了animations数组,而不是往数组里追加新元素。比如你可能写了类似$animations = [...];的代码,每次循环都把数组重置成只有当前元素,自然最后就只剩最后一个值了。
下面给你一套完整的解决方案,模拟表单提交后生成符合你预期的JSON文件:
<?php // 假设你的表单提交了多个动画相关的参数,比如多个颜色值(这里用模拟数据,实际用$_POST获取即可) $submitted_colors = ['Red', 'Blue', 'Green']; // 先初始化好整个animation的基础结构 $final_data = [ 'animation' => [ 'typename' => 'split', 'size' => 6, 'animations' => [] // 先把animations设为空数组,后面用来加元素 ] ]; // 循环生成每个动画项,关键是用[]追加元素,不是覆盖数组 foreach ($submitted_colors as $color) { $animation_item = [ 'typename' => 'BiblioPixelAnimations.strip.ColorChase.ColorChase', 'color' => $color ]; // 重点:用[]把新元素加到数组末尾,而不是重新赋值$final_data['animation']['animations'] $final_data['animation']['animations'][] = $animation_item; } // 把数据编码成JSON,加上JSON_PRETTY_PRINT让格式更美观 $json_output = json_encode($final_data, JSON_PRETTY_PRINT); // 写入到webtest1.json文件里 file_put_contents('webtest1.json', $json_output); ?>
运行这段代码后,生成的webtest1.json内容就和你想要的一样了:
{ "animation": { "typename": "split", "size": 6, "animations": [ { "typename": "BiblioPixelAnimations.strip.ColorChase.ColorChase", "color": "Red" }, { "typename": "BiblioPixelAnimations.strip.ColorChase.ColorChase", "color": "Blue" }, { "typename": "BiblioPixelAnimations.strip.ColorChase.ColorChase", "color": "Green" } ] } }
核心就是记住:不要在循环里直接给animations数组重新赋值,要用[]语法向数组末尾追加新的动画对象。如果你的表单是用其他方式传递多个参数,只需要调整循环的数据源就行,核心逻辑不变。
内容的提问来源于stack exchange,提问作者Adam D
相关产品推荐
相关产品推荐

