Json_encode разреженный массив PHP как массив JSON, а не объект JSON

У меня есть следующий массив в PHP:

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

Я хочу, чтобы JSON закодировал его как массив JSON, создав строку вроде следующего:

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

Но когда я вызываю json_encode в этом массиве, я получаю следующее:

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

который является объектом вместо массива.

Как я могу получить json_encode для кодирования моего массива как массива вместо?

Ответ 1

Вы наблюдаете это поведение, потому что ваш массив не является последовательным - он имеет ключи 0 и 2, но не имеет 1 в качестве ключа.

Просто иметь числовые индексы недостаточно. json_encode будет кодировать только ваш массив PHP как массив JSON, если ваш массив PHP является последовательным, то есть, если его ключи равны 0, 1, 2, 3,...

Вы можете повторно проиндексировать свой массив последовательно, используя функцию array_values, чтобы получить нужное поведение. Например, приведенный ниже код успешно работает в вашем случае использования:

echo json_encode(array_values($input)).

Ответ 2

Array in JSON - это индексированный массив только, поэтому структура, которую вы пытаетесь получить, недействительна Json/Javascript.

PHP Ассоциативный массив - это объекты в JSON, поэтому, если вам не нужен индекс, вы не можете делать такие преобразования.

Если вы хотите получить такую ​​структуру, вы можете сделать:

$indexedOnly = array();

foreach ($associative as $row) {
    $indexedOnly[] = array_values($row);
}

json_encode($indexedOnly);

Вернет что-то вроде:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]

Ответ 3

json_decode ($ jsondata, true);

true превращает все свойства в массив (последовательный или нет)

Ответ 4

Попробуйте это,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>