Как добавить данные в JSON с помощью PHP

У меня есть файл 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";
    }
}

Конечно, это не помогает, пожалуйста, какие-нибудь идеи?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
76
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Есть несколько проблем.

  • Во-первых, цикл foreach работает с копией массива, который он повторяет, поэтому изменение одного из элементов в нем не изменит исходный массив.

  • Затем ваш внутренний цикл foreach перезаписывает $key из внешнего цикла. Этот было бы вызывает проблемы, но это нормально, потому что на самом деле вам не нужен внутренний цикл.

  • Наконец, после того, как вы декодировали строку JSON, $data будет массивом, поэтому добавление к нему с помощью .= не сработает, и даже если бы это было так, вы бы просто приклеили что-то к его концу, а не к конкретная точка, где находится ваш цикл.

Просто обратитесь к конкретному ключу, который вам нужен, и установите там значение.

$data = json_decode($file, true);
foreach ($data as $key => $val)
{
    $data[$key]['user_id'] = $userId;
}
$data = json_encode($data);

Вау! Спасибо всем за ваш ценный вклад! Я нашел ответы Лоуренса и Рафаэля правильными, я предпочитаю использовать массивы. Всем добрых ребят!

user2638842 25.08.2018 19:49

Пожалуйста! Если вы в конечном итоге используете цикл foreach со ссылкой, обязательно отключите ссылку после цикла, иначе могут произойти некоторые странные вещи. (Вы можете проверить документацию по foreach для получения более подробной информации об этом)

Don't Panic 25.08.2018 23:13

Вот как вы можете добавить элемент в проанализированный 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;
}

https://3v4l.org/ZF4Ve

Другие вопросы по теме