PHP: Таргетирование конкретного массива JSON и добавление POST-данных правильно?

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

[{ "name": "James", "reviews": [ { "stars": 5, "body": "great!" }, { "stars": 1, "body": "bad!" } ] }, { "name": "David", "reviews": [ { "stars": 4, "body": "pretty good!" }, { "stars": 2, "body": "just ok..." } ] }] 

Теперь, когда вы ставите новые данные обзора для Дэвида на PHP-скрипт, как мне настроить целевые «обзоры» Дэвида и добавить его?

Я уже правильно декодировал все и получил доступ как к декодированному файлу, так и к сообщению. Я просто не знаю, как настроить конкретные отзывы Дэвида в массиве JSON … Спасибо заранее!

ОБНОВЛЕНИЕ. Чтобы быть ясным, все уже декодировано, данные POST и файл JSON с сервера. Мне просто нужно знать, как конкретно настроить показания Дэвида и добавить его.

ОБНОВЛЕНИЕ 2 – Все, пожалуйста, также поймите, что это в том случае, если индекс неизвестен. Выполнение [1] было бы потрясающе, но когда кто-то подчиняется, они не будут знать, какой именно индекс. Цикл для рендеринга выполняется в AngularJS btw, поэтому не может назначать что-либо на стороне PHP для front-end.

PHP> = 5.5.0, необходимый для array_column или ниже для альтернативного:

 $array[array_search('David', array_column($array, 'name'))]['reviews'][] = array( 'stars'=>1,'body'=>'meh' ); 

Вместо array_column вы можете использовать:

 array_map(function($v) { return $v['name']; }, $array); 

Вам нужно будет использовать for-loop / foreach для итерации через тестирование массива, где arr ['name'] === 'David', тогда вы можете получить доступ к arr ['reviews'].

 foreach ($array as $person) { if ($person['name'] === 'David') { $person['reviews'][] = array("stars"=> 3,"body"=> "pretty cool!"); break; } } 

Изменить: вы также можете создать общую функцию для этого

 function findElem(arr,field,e) { foreach ($arr as $elem) { if ($elem[field] === e) { return $elem; } } return null; } 

звонить:

 $elem = findElem(myArray,'name','David'); if ($elem !== null) $elem[] = array("stars"=> 3,"body"=> "pretty cool!"); 

Похоже, больше работы, но если вы собираетесь делать это много раз, то это помогает.

Если вы хотите конкретно отзывы Дэвида и только отзывы Дэвида … предполагая, что массив $ содержит массив json_decoded:

 $david_reviews = $array[1]["reviews"]; foreach($david_reviews as $review){ //Do code to retrieve indexes of array $stars = $review["stars"] //5 $body = $review["body"] //Great! } 

Если вы хотите получить обзоры для каждого результата, тогда ответ пользователя2225171 – это то, что вы ищете.

json_decode($json, true) вернет вам простой массив данных. Затем сохраните то, что вам нужно, и сохраните его с помощью json_encode()