JSON Поиск и удаление в php?

У меня есть переменная сеанса $_SESSION["animals"] содержащая глубокий объект json со значениями:

 $_SESSION["animals"]='{ "0":{"kind":"mammal","name":"Pussy the Cat","weight":"12kg","age":"5"}, "1":{"kind":"mammal","name":"Roxy the Dog","weight":"25kg","age":"8"}, "2":{"kind":"fish","name":"Piranha the Fish","weight":"1kg","age":"1"}, "3":{"kind":"bird","name":"Einstein the Parrot","weight":"0.5kg","age":"4"} }'; 

Например, я хочу найти строку с «Piranha the Fish», а затем удалить ее (и json_encode снова, как было). Как это сделать? Думаю, мне нужно искать в json_decode($_SESSION["animals"],true) результирующий массив и найти родительский ключ для удаления, но я все равно застрял.

Related of "JSON Поиск и удаление в php?"

json_decode превратит объект JSON в структуру PHP, json_decode из вложенных массивов. Тогда вам просто нужно пройти через них и unset тот, который вы не хотите.

 <?php $animals = '{ "0":{"kind":"mammal","name":"Pussy the Cat","weight":"12kg","age":"5"}, "1":{"kind":"mammal","name":"Roxy the Dog","weight":"25kg","age":"8"}, "2":{"kind":"fish","name":"Piranha the Fish","weight":"1kg","age":"1"}, "3":{"kind":"bird","name":"Einstein the Parrot","weight":"0.5kg","age":"4"} }'; $animals = json_decode($animals, true); foreach ($animals as $key => $value) { if (in_array('Piranha the Fish', $value)) { unset($animals[$key]); } } $animals = json_encode($animals); ?> не <?php $animals = '{ "0":{"kind":"mammal","name":"Pussy the Cat","weight":"12kg","age":"5"}, "1":{"kind":"mammal","name":"Roxy the Dog","weight":"25kg","age":"8"}, "2":{"kind":"fish","name":"Piranha the Fish","weight":"1kg","age":"1"}, "3":{"kind":"bird","name":"Einstein the Parrot","weight":"0.5kg","age":"4"} }'; $animals = json_decode($animals, true); foreach ($animals as $key => $value) { if (in_array('Piranha the Fish', $value)) { unset($animals[$key]); } } $animals = json_encode($animals); ?> 

У вас есть дополнительная запятая в конце последнего элемента вашего JSON. Удалите его, и json_decode вернет массив. Просто пропустите его, проверьте строку, а затем отмените элемент при его обнаружении.

Если вам нужен реиндексированный последний массив, просто передайте его в array_values .

Это работает для меня:

 #!/usr/bin/env php <?php function remove_json_row($json, $field, $to_find) { for($i = 0, $len = count($json); $i < $len; ++$i) { if ($json[$i][$field] === $to_find) { array_splice($json, $i, 1); } } return $json; } $animals = '{ "0":{"kind":"mammal","name":"Pussy the Cat","weight":"12kg","age":"5"}, "1":{"kind":"mammal","name":"Roxy the Dog","weight":"25kg","age":"8"}, "2":{"kind":"fish","name":"Piranha the Fish","weight":"1kg","age":"1"}, "3":{"kind":"bird","name":"Einstein the Parrot","weight":"0.5kg","age":"4"} }'; $decoded = json_decode($animals, true); print_r($decoded); $decoded = remove_json_row($decoded, 'name', 'Piranha the Fish'); print_r($decoded); ?>