У меня есть файл json со следующим синтаксисом:
[
{
"fields": {
"service_number": "service_number",
"physical_address": "physical_address",
"account_id": "account_id",
"contact_id": "contact_id"
},
"someId": "asd23f",
"status": "Active",
"perCode": "1",
"idCode": "0987",
"nextCode": "09"
},
{
"fields": {
"service_number": "service_number",
"physical_address": "physical_address",
"account_id": "account_id",
"contact_id": "contact_id"
},
"someId": "789096",
"status": "Active",
"perCode": "1",
"idCode": "076543",
"nextCode": "09"
}
]
Я хотел бы использовать цикл for, чтобы добавить что-то вроде идентификатора пользователя до или после nextCode. Есть ли решение этого? Пока что я пробовал это:
$data = json_decode($file, true);
foreach ($data as $key => $val)
{
foreach ($val as $key=>$c)
{
if (is_array($c))
continue;
$data .= $data . "user_id:$userId";
}
}
Конечно, это не помогает, пожалуйста, какие-нибудь идеи?






Есть несколько проблем.
Во-первых, цикл foreach работает с копией массива, который он повторяет, поэтому изменение одного из элементов в нем не изменит исходный массив.
Затем ваш внутренний цикл foreach перезаписывает $key из внешнего цикла. Этот было бы вызывает проблемы, но это нормально, потому что на самом деле вам не нужен внутренний цикл.
Наконец, после того, как вы декодировали строку JSON, $data будет массивом, поэтому добавление к нему с помощью .= не сработает, и даже если бы это было так, вы бы просто приклеили что-то к его концу, а не к конкретная точка, где находится ваш цикл.
Просто обратитесь к конкретному ключу, который вам нужен, и установите там значение.
$data = json_decode($file, true);
foreach ($data as $key => $val)
{
$data[$key]['user_id'] = $userId;
}
$data = json_encode($data);
Пожалуйста! Если вы в конечном итоге используете цикл foreach со ссылкой, обязательно отключите ссылку после цикла, иначе могут произойти некоторые странные вещи. (Вы можете проверить документацию по foreach для получения более подробной информации об этом)
Вот как вы можете добавить элемент в проанализированный JSON и восстановить его обратно в JSON:
// parse the JSON into an array
$data = json_decode($file, true);
foreach ($data as $key => $val)
{
// add the userID to each element of the main array
// it will be inserted after the last element (after nextCode)
$data[$key]['userID'] = 'some-id';
}
// if needed, parse the array back to JSON
$data = json_encode($data);
Я объясняю тебе
Следующее выражение преобразует информацию из строки в массив
$data = json_decode ($file, true);
Итак, в вашем foreach вам нужно только добавить ключ
$data = json_decode($file, true);
foreach ($data as $key => $val)
{
foreach ($val as $k=>$c)
{
if (is_array($c))
continue;
$data[$k]['user_id'] = $userId;
}
}
Я вижу, что все ответили на вопрос о вариантах массива. Однако я не понимаю, почему бы не использовать объект.
Я бы сделал это так:
$data = json_decode($file);
foreach ($data as &$field)
{
$field->userID = $userId;
}
$data = json_encode($data);
Другой способ, который немного короче, - передать значение по ссылке &:
$data = json_decode($file, true);
foreach ($data as &$val) {
$val['user_id'] = $userId;
}
Вау! Спасибо всем за ваш ценный вклад! Я нашел ответы Лоуренса и Рафаэля правильными, я предпочитаю использовать массивы. Всем добрых ребят!