У меня есть json-массив. в котором у меня есть 3 значения. когда я удаляю первое или второе значение, результирующий массив после удаления – это один формат. Но когда я удаляю последнее значение, всегда изменяется результирующий массив. Я эхо повторяю массив, преобразовывая его в строку.
Когда я удаляю любое значение, кроме последнего, это похоже на 1 или 2 или любое другое значение
result = {"1": {"name": "cat"}, "2": {"name": "elephant"}}
Здесь я удалил первое значение – собака
$animals = '{ "0":{"name":"dog"}, "1":{"name":"cat"}, "2":{"name":"elephant"} }'; $animals = json_decode($animals, true); $del_value = "elephant"; $loginArray = array('name' => $del_value); if (in_array($loginArray, $animals)) { foreach ($animals as $key => $value) { if (in_array($del_value, $value)) { unset($animals[$key]); } } } $animals_string = json_encode($animals); echo $animals_string;
но когда я удаляю последнее значение, он создает другой формат
result = [{"name": "dog"}, {"name": "cat"}]
Здесь я удалил последнее значение – слон
$animals = '{ "0":{"name":"dog"}, "1":{"name":"cat"}, "2":{"name":"elephant"} }'; $animals = json_decode($animals, true); $del_value = "elephant"; $loginArray = array('name' => $del_value); if (in_array($loginArray, $animals)) { foreach ($animals as $key => $value) { if (in_array($del_value, $value)) { unset($animals[$key]); } } } $animals_string = json_encode($animals); echo $animals_string;
не$animals = '{ "0":{"name":"dog"}, "1":{"name":"cat"}, "2":{"name":"elephant"} }'; $animals = json_decode($animals, true); $del_value = "elephant"; $loginArray = array('name' => $del_value); if (in_array($loginArray, $animals)) { foreach ($animals as $key => $value) { if (in_array($del_value, $value)) { unset($animals[$key]); } } } $animals_string = json_encode($animals); echo $animals_string;
Такое поведение ожидается.
PHP поддерживает 2 типа массива:
Однако JSON поддерживает только 2-й тип массива, поэтому, когда вы конвертируете ассоциативный массив в JSON, вы получаете вместо него объект.
Пример:
print_r(json_encode([ 1,2,3,4 ])); //Prints [1,2,3,4] print_r(json_encode([ 0=> 1, 1=>2, 2=>3, 3=>4 ])); //also prints [1,2,3,4] print_r(json_encode([ "a" => 1, "b" => 2 ])); //Prints {"a":1,"b":2} print_r(json_encode([ 1 => "a" , 2 => "b" ])); //Prints {"1":"a","2":"b"}
Внесите массив PHP (любого типа) в массив JSON, сбросив исходные ключи:
$animals_string = json_encode(array_values($animals)); //Will always have form : [{"name": "X" },{"name":"Y"}]
Принудительный массив PHP (любого типа) к объекту JSON:
$animals_string = json_encode((object)$animals); //Will always have form : {"i1":{"name":"X"},"i2":{"name":"Y"}}
Проблема в вашем конкретном случае заключается в том, что ваш объект JSON преобразуется в числовой индексный массив PHP, который при кодировании обратно становится массивом JSON:
$animals = '{ "0":{"name":"dog"}, "1":{"name":"cat"}, "2":{"name":"elephant"} }'; $animals = json_decode($animals, true); echo json_encode($animals);
Отголоски
[{ "Имя": "собака"}, { "имя": "кошка"}, { "имя": "слон"}]
Если вы удаляете один из индексов, отличный от последнего, это делает ассоциативный массив PHP, который переводится в объект JSON.
Это то, как работает PHP, если вы хотите получить другой вывод, который должен быть явным, как показано ниже:
$animals = '{ "0":{"name":"dog"}, "1":{"name":"cat"}, "2":{"name":"elephant"} }'; $animals = json_decode($animals, true); $del_value = "elephant"; $loginArray = array('name' => $del_value); if (in_array($loginArray, $animals)) { foreach ($animals as $key => $value) { if (in_array($del_value, $value)) { unset($animals[$key]); } } } $animals_string = json_encode((object)$animals); echo $animals_string; //Always the same format
не$animals = '{ "0":{"name":"dog"}, "1":{"name":"cat"}, "2":{"name":"elephant"} }'; $animals = json_decode($animals, true); $del_value = "elephant"; $loginArray = array('name' => $del_value); if (in_array($loginArray, $animals)) { foreach ($animals as $key => $value) { if (in_array($del_value, $value)) { unset($animals[$key]); } } } $animals_string = json_encode((object)$animals); echo $animals_string; //Always the same format
Надеюсь, это поможет.