Мне нужно сгенерировать закодированную строку JSON из массива. Однако, когда я просто убираю элемент из массива, структура всей строки становится совсем другой.

В качестве примера возьмем этот код:

$temp1 = array();

$temp1[] = array("x" => "aaa", "y" => "bbb");
$temp1[] = array("x" => "ccc", "y" => "ddd");
$temp1[] = array("x" => "eee", "y" => "fff");

$encoded = json_encode($temp1);

echo $encoded;

Это выведет:

[{"x":"aaa","y":"bbb"},{"x":"ccc","y":"ddd"},{"x":"eee","y":"fff"}]

Конечно, этого я и ожидал! А теперь взгляните на очень похожий код ниже:

$temp1 = array();

$temp1[] = array("x" => "aaa", "y" => "bbb");
$temp1[] = array("x" => "ccc", "y" => "ddd");
$temp1[] = array("x" => "eee", "y" => "fff");

unset($temp1[0]);

$encoded = json_encode($temp1);

echo $encoded;

Будет выводить

"{"1":{"x":"ccc","y":"ddd"},"2":{"x":"eee","y":"fff"}}"

Как я могу заставить второй код работать как первый (что, на мой взгляд, является ожидаемым результатом, поскольку удаление элемента и элемента из массива не должно влиять на структуру выходной закодированной строки.

0
amandanovaes 15 Сен 2018 в 02:08

2 ответа

Лучший ответ

unset сохраняет индексы нетронутыми, поэтому после использования unset вы можете «пересчитать» данные, используя array_values :

<?php
$temp1 = array();

$temp1[] = array("x" => "aaa", "y" => "bbb");
$temp1[] = array("x" => "ccc", "y" => "ddd");
$temp1[] = array("x" => "eee", "y" => "fff");

unset($temp1[0]);
$temp1 = array_values($temp1);
$encoded = json_encode($temp1);

echo $encoded;
// will output the expected result:[{"x":"ccc","y":"ddd"},{"x":"eee","y":"fff"}]
?>
1
Jose Mato 14 Сен 2018 в 23:40
        $temp1 = array();
        $temp1[] = array("x" => "aaa", "y" => "bbb");
        $temp1[] = array("x" => "ccc", "y" => "ddd");
        $temp1[] = array("x" => "eee", "y" => "fff");

        array_splice($temp1,0,1);

        $encoded = json_encode($temp1);
        echo $encoded;
0
Jenice Vazquez 14 Сен 2018 в 23:39