Добавить данные в дочерний массив JSON

Это мой файл JSON (database.json):

{
  "doctors": [
    {
      "ID": "ahmadakhavan",
      "pass": "1234",
      "name": "Ahmad Akhavan",
      "profilePic": "address",
    },
    {
      "ID": "akramparand",
      "pass": "1234",
      "name": "Akram Parand",
      "profilePic": "address",
    }
  ],
  "games": [
    {
      "ID": "shuttlefuel_1",
      "locked": "0",
      "logo": "gameLogo",
    },
    {
      "ID": "birthdaycake",
      "locked": "0",
      "logo": "gameLogo",
    }
  ],
  "users": [
    {
      "ID": "alirezapir",
      "prescribes": [
        {
          "doctorName": "doctor1",
          "done": "yes",
          "gameId": "wordschain"
        },
        {
          "doctorName": "doctor2",
          "done": "no",
          "gameId": "numberlab"
        }
      ],
      "profilePic": "address"
    },
    {
      "ID": "amirdibaei",
      "pass": "1234",
      "profilePic": "address"
    }
  ]
}

Я хочу добавить дочерний элемент в массив prescribes для определенного идентификатора.

Ниже показано, что я сделал в своем PHP-коде для этого:

 <?php 
  $username = $_REQUEST['name'];
  $data = $_REQUEST['data'];

  //Load the file
 $contents = file_get_contents('./database.json');
  $arraydata = json_decode($data,true);
 //Decode the JSON data into a PHP array.
 $contentsDecoded = json_decode($contents, true );
     foreach($contentsDecoded['users'] as $item){
         if ($item['ID'] == $username){
             if (!isset($item['prescribes'])){
                 $item['prescribes'] = Array();
             }
             array_push($item['prescribes'],$arraydata);
            $json = json_encode($contentsDecoded, JSON_UNESCAPED_UNICODE );
            file_put_contents('./database.json', $json);  
             exit('1');
             exit;
         }
     }
    exit('0'); 
    exit;
 ?> 

Если я повторю $item['prescribes'] после строки array_push($item['prescribes'],$arraydata);, я увижу добавленные к ней данные, но исходный файл (database.json) не будет отображать новые добавленные данные.

(это означает, что эти новые данные не добавляются в $contentsDecoded)

что за «база данных» :)) это файл man файл json :)))

madalinivascu 21.05.2019 12:44

@madalinivascu Хорошо :)) это всего лишь крошечный файл JSON...

Alireza Pir 21.05.2019 12:46

почему ты не делаешь if (!isset($item['prescribes'])){ $item['prescribes'] =[$arraydata]; } ?

madalinivascu 21.05.2019 12:48

@madalinivascu, потому что я ДОБАВЛЯЮ новый элемент в массив prescribes, я не хочу полностью заменять его :)

Alireza Pir 21.05.2019 12:49
Стоит ли изучать 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 и хотите разрабатывать...
2
4
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны изменить код foreach(), как показано ниже: -

foreach($contentsDecoded['users'] as &$item){ //& used as call by reference
    if ($item['ID'] == $username){
        $item['prescribes'][] = $arraydata; //assign new value directly
        $json = json_encode($contentsDecoded, JSON_UNESCAPED_UNICODE );
        file_put_contents('./database.json', $json);  
        exit;
    }
}

Измените свой foreach, чтобы изменить массив $contentsDecoded:

foreach($contentsDecoded['users'] as $key => $item){
         if ($item['ID'] == $username){
             if (!isset($item['prescribes'])){
                 $contentsDecoded['users'][$key]['prescribes'] = Array();
             }
             array_push($contentsDecoded['users'][$key]['prescribes'],$arraydata);
            $json = json_encode($contentsDecoded, JSON_UNESCAPED_UNICODE );
            file_put_contents('./database.json', $json);  
             exit('1');
             exit;
         }
     }

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