Чрезвычайно нежелательно пытаться вручную создать строку json в цикле.Вы должны создать действительный массив, а затем преобразовать его в json, когда закончите.
Чтобы построить нужный массив результатов, просто вставьте новые данные в соответствующий подмассив.
Код: ( Демо )
$country_ids = range(1,5);
$result['fields'][0]['field_type'] = "countries";
foreach ($country_ids as $id) {
$result['fields'][0]['field_value'][] = ["country_id" => $id, "match_type" => "exact"];
}
var_export($result);
echo "\n---\n";
echo json_encode($result, JSON_PRETTY_PRINT); // this resembles your posted data
Вывод (как в массиве, так и в формате json):
array (
'fields' =>
array (
0 =>
array (
'field_type' => 'countries',
'field_value' =>
array (
0 =>
array (
'country_id' => 1,
'match_type' => 'exact',
),
1 =>
array (
'country_id' => 2,
'match_type' => 'exact',
),
2 =>
array (
'country_id' => 3,
'match_type' => 'exact',
),
3 =>
array (
'country_id' => 4,
'match_type' => 'exact',
),
4 =>
array (
'country_id' => 5,
'match_type' => 'exact',
),
),
),
),
)
---
{
"fields": [
{
"field_type": "countries",
"field_value": [
{
"country_id": 1,
"match_type": "exact"
},
{
"country_id": 2,
"match_type": "exact"
},
{
"country_id": 3,
"match_type": "exact"
},
{
"country_id": 4,
"match_type": "exact"
},
{
"country_id": 5,
"match_type": "exact"
}
]
}
]
}