У меня есть переменная сеанса $_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)
результирующий массив и найти родительский ключ для удаления, но я все равно застрял.
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); ?>