You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:49:36