Процесс удаления одного и того же json-массива создает другой массив результатов для различной позиции значения

У меня есть 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 типа массива:

  1. Ассоциатив: где индексы могут быть строками или целыми неотрицательными
  2. Числовое индексирование: где индексы представляют собой последовательные целые числа, начинающиеся с 0

Однако 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 

Надеюсь, это поможет.