Как заменить данные и пересохранить json файл?

Olga93

Новичок
Пытаюсь заменить некоторые данные и пересохранить json-файл. В итоге при сохранении response пропадает. Пример на картинке.
1593
Соответственно после повторного обновления страницы, в документ сохраняется NULL, так как без response, не удается правильно распарсить json. Как сделать так, чтобы response тоже сохранялся?
PHP:
<?php

$ourData = file_get_contents("data.json");

$outcls=json_decode($ourData,true);

$posts1 = $outcls["response"];

foreach($posts1 as $itemKey => $item)
{
 
  if($item["status"]=="current")
  {
    
    $posts1[$itemKey]["status"]="ok";
    $posts1[$itemKey+1]["status"]="current";
  }
}

file_put_contents('data.json', json_encode($posts1));

?>
 

antonio

Moderator
Команда форума
$posts1 = $outcls["response"];
не добавит ключ "response" в твой ассоциативный массив $posts1.
 

antonio

Moderator
Команда форума
Я добрый сегодня, поэтому
$posts1["response"] = $outcls["response"];
 

Olga93

Новичок
Я добрый сегодня, поэтому
$posts1["response"] = $outcls["response"];
Все поняла, что вы имели ввиду ранее.
Результат:
PHP:
<?php

$ourData = file_get_contents("data.json");

$outcls=json_decode($ourData,true);

$posts1["response"] = $outcls["response"];

$count = 1;
foreach($posts1["response"] as $itemKey => $item)
{
  if($item["status"]=="ok")
  {
    $count++;
 
  }
  if($item["status"]=="current")
  {
    
    
    $posts1["response"][$itemKey]["status"]="ok";
    if($count!=count($posts1["response"]))
        $posts1["response"][$itemKey+1]["status"]="current";
    
    
  }
 
}

file_put_contents('data.json', json_encode($posts1));

echo "<pre>";
print_r($posts1);
echo "</pre>";
?>
 

WMix

герр M:)ller
Партнер клуба
а че за танцы с бубном в этих строках?
PHP:
foreach($posts1["response"] as $itemKey => $item){
  if($item["status"]=="ok"){
    $count++;
  }
  if($item["status"]=="current"){
    $posts1["response"][$itemKey]["status"]="ok";
    if($count!=count($posts1["response"])){
        $posts1["response"][$itemKey+1]["status"]="current";
    }
  }
}
 

Olga93

Новичок
а че за танцы с бубном в этих строках?
Надо посчитать, сколько записей содержится в response у которых есть статус ok. Я пыталась просто добавить начальную переменную $count и к ней прибавлять единицу, а потом сравнивать это значение, с count response, но при каждом обновлении страницы, у меня значение $count обнулялось и при итерации я всегда получала единицу. Поэтому решила в цикле сравнивать, где есть статус ok и тогда прибавлять единицу, таким образом код проходит через цикл ищет status=ok и формирует значение, всего записей со статусом ok.

Сравнение нужно
if($count!=count($posts1["response"]))
Потому, что без него код php создает дополнительные узлы в json со значением status=current, в том случае когда скрипт достигает конца списка и уже узлы отсутсвуют.
 

a1exey

Новичок
Код:
$outcls=json_decode($ourData,true);
эта строка приводит всё к ассоциативному массиву и сбрасывает ключ response (правда в ответе это свойство т.к. в ответе приходит объект). Просто не приводите всё к ассоциативному массиву, а работайте с объектом обращаясь напрямую к свойству, так структура не похерится.
 
Сверху