PHP обновляет json из полученных входных данных и записывает обратно в тот же файл

#php #json

#php #json

Вопрос:

У меня есть файл json, хранящийся на сервере, и он выглядит следующим образом:

 {
    "support_link":"#",
    "support_link_2":"#",
    "packs":[
        {
            "identifier":1,
            "viewCount":0,
            "downloadCount":0
        },
        {
            "identifier":2,
            "viewCount":0,
            "downloadCount":0
        }
    ]
}
 

Используя PHP, я хочу обновить количество просмотров и загрузок некоторых массивов внутри пакетов.
Но дело в том, что данные поступают через POST метод на сервер, который содержит другой json с информацией. из какого идентификатора обновлять и какой параметр обновлять, и я не могу обновить существующий файл и сохранить его обратно.

Полученный формат Json:

 {
    "impressions": [
        {
            "identifier": "1",
            "impressionCount": 2
        },
        {
            "identifier": "100",
            "impressionCount": 2
        },
        {
            "identifier": "1000",
            "impressionCount": 2000
        }
    ],
    "downloads": [
        {
            "identifier": "1",
            "downloadCount": 10
        }
    ]
}
 

Что я пытался сделать до сих пор:

 $json = file_get_contents('php://input');
if ($json != '') {
    $properJsonFormatted = json_decode($json, true);
    $impressions = $properJsonFormatted['impressions'];
    $downloads = $properJsonFormatted['downloads'];
    
    $testConfig = 
    $json = file_get_contents('php://input');
    if ($json != '') {
        $properJsonFormatted = json_decode($json, true);
        $impressions = $properJsonFormatted['impressions'];
        $downloads = $properJsonFormatted['downloads'];
    
        $testConfig = json_decode(file_get_contents("test_config.json"),true);
        $packs = $testConfig['packs'];
    
    
        foreach ($packs as amp;$pack) {
            $packIdentifier = $pack['identifier'];
            
            foreach ($impressions as $impression) {
                $impressionIdentifier = $impression['identifier'];
                if ($packIdentifier == $impressionIdentifier) {
                    $pack['viewCount']  = $impression['impressionCount'];
                    $newCount = $pack['viewCount'];
                    
                    print("Id: $packIdentifier,  ViewCount: $newCountn");
                }
            }
        }
        
        put_file_contents("test_config.json" , $testConfig);
        // print_r($testConfig);
        // Save back the updated test_config.json
    }
}
 

Комментарии:

1. Ну, для каждого $pack вы просматриваете $impressions поиск соответствия identifier

Ответ №1:

Обновить

Похоже, вы неправильно истолковали вопрос. Реальная проблема, похоже, намного проще.

Измените это:

 put_file_contents("test_config.json" , $testConfig);
 

Для этого:

 file_put_contents('test_config.json', json_encode($testConfig));
 

Также измените это:

 $packs = $testConfig['packs'];
 

Для этого:

 $packs = amp;$testConfig['packs'];
 

Похоже, вы забыли назначить это по ссылке, хотя вы правильно сделали это в foreach .

Комментарии:

1. Спасибо за это, но я не имею в виду добавлять объекты, полученные из входных данных, я хочу получить массив показов -> получить идентификатор, если они оба совпадают -> увеличить значение viewCount путем добавления impressionCount , то же самое касается количества загрузок, однако я могу это сделать, но в финале testConfig , когдасохранен, не содержит обновленных данных

2. Я вижу. Ваш вопрос и код не были ясны в этом ( $pack['viewCount'] = 1900; ??). Из моего ответа нетрудно перейти от «перезаписать» к «добавить». Дайте мне знать, если вам нужна помощь в этом.

3. Извините за это, это был просто заполнитель, я обновил то, как я пытался с кодом, значение, похоже, теперь обновляется, но новые значения не сохраняются в файл обратно.

4. Хорошее эмпирическое правило — всегда публиковать фактический код, с которым вы боретесь ;). Но все в порядке, я думаю, что все равно смогу вам помочь. Смотрите Мой пересмотренный ответ для решения того, что, по моему мнению, происходило.

5. Еще раз спасибо, я вижу, что test_config действительно сохраняется в файле: D, могу сказать это наверняка, потому что отступ исчезает, но изменения не отражаются в файле, значения по-прежнему равны 0.