PHP遍历数组时如何生成含嵌套fields数组的目标JSON
解决PHP遍历数组生成嵌套fields JSON数组的问题
我看出来你的问题啦——当前代码每次处理fields.开头的键时,都是直接覆盖掉整个$request['fields']数组,所以最后只会剩下最后一个字段。咱们只需要调整数组赋值的逻辑,从替换改成追加,再加上必要的初始化就能搞定!
修改后的完整代码
// 示例原始数据,可替换为你的实际$address_data $address_data = [ [ 'campaignId' => '18210f12-502c-4d71-a098-4f595304a8d0', 'fields.CPLastName' => 'Voornaam 1', 'fields.CPFirstname' => 'Achternaam 1', 'fields.OROrganisation' => 'Bedrijf 1' ], [ 'campaignId' => '18210f12-502c-4d71-a098-4f595304a8d0', 'fields.CPLastName' => 'Voornaam 2', 'fields.CPFirstname' => 'Achternaam 2', 'fields.OROrganisation' => 'Bedrijf 2' ] ]; foreach($address_data as $address) { // 每次处理新地址时重置request,避免残留上一次的数据 $request = [ 'campaignId' => '', 'fields' => [] ]; foreach($address as $key => $value){ if($key == 'campaignId') { $request[$key] = $value; } // 精准匹配以fields.开头的键,避免误匹配 if (strpos($key, 'fields.') === 0) { $fields = explode('.', $key); // 核心修改:用[]追加元素,而非替换整个数组 $request['fields'][] = [ 'fieldId' => $fields[1], 'value' => $value ]; } } // 输出格式化后的JSON,和你期望的格式一致 echo json_encode($request, JSON_PRETTY_PRINT) . PHP_EOL; }
关键修改点说明
- 初始化request数组:每次遍历单个地址前,重新初始化
$request,确保每个地址的字段都是独立的,不会携带上一次循环的残留数据。 - 追加fields元素:把原来的
$request['fields'] = array(...)改成$request['fields'][] = array(...),这样会把每个fields.开头的键值对作为新对象追加到fields数组中,而不是覆盖整个数组。 - 精准匹配键名:将
strpos($key, 'fields')改为strpos($key, 'fields.') === 0,确保只匹配以fields.开头的键,避免误处理类似fields_test这种不符合格式的键。 - 格式化JSON输出:添加
JSON_PRETTY_PRINT参数,让输出的JSON自动换行缩进,和你期望的目标格式完全一致(如果不需要格式化,可以去掉这个参数)。
最终输出结果
运行后会生成你想要的JSON格式:
{ "campaignId": "18210f12-502c-4d71-a098-4f595304a8d0", "fields": [ { "fieldId": "CPLastName", "value": "Voornaam 1" }, { "fieldId": "CPFirstname", "value": "Achternaam 1" }, { "fieldId": "OROrganisation", "value": "Bedrijf 1" } ] } { "campaignId": "18210f12-502c-4d71-a098-4f595304a8d0", "fields": [ { "fieldId": "CPLastName", "value": "Voornaam 2" }, { "fieldId": "CPFirstname", "value": "Achternaam 2" }, { "fieldId": "OROrganisation", "value": "Bedrijf 2" } ] }
内容的提问来源于stack exchange,提问作者Pale
相关产品推荐
相关产品推荐

