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


119

У меня в 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вместо этого закодировать свой массив как массив?

Ответы:


194

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

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

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

echo json_encode(array_values($input)).

4
а что, если ключи 0,2важны? Я в той же ситуации, когда я не могу переиндексировать массив.
shyammakwana.me

2
JSON не поддерживает ассоциативный массив. см .: tools.ietf.org/html/rfc7159#section-5
Нгуен Ван Винь

74

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

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

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

$indexedOnly = array();

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

json_encode($indexedOnly);

Будет возвращать что-то вроде:

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

1
Спасибо, что дали мне подсказку об индексированном массиве :) проблема заключалась в том, что я проиндексировал его таким образом, что идентификатор был также идентификатором массива вместо последовательного идентификатора, а json_encode не взял его как массив, а как в вместо этого, потому что массив не был последовательным, теперь он исправлен, спасибо за вашу помощь, ребята :)

Не правда. Некоторые библиотеки кодируют ассоциативные массивы как массивы с индексом как одним из свойств элемента.
Густаво

Я не понимаю, что вы имеете в виду - массив в ответе Мартина не индексирован, и это действительный JSON.
И наконец

@AndFinally массив в ответ Мартина это фактически индексированные, неявно. Пропуск индекса приводит к созданию индексированного массива, начинающегося с нуля.
Борис Гери

Этот ответ не совсем соответствовал тому, что хотел OP в то время, когда они разместили вопрос (неудивительно, поскольку то, что OP хотел, было невозможно), и их правки к нему с тех пор оставили этот ответ, казалось бы, дико неправильным, учитывая текущее состояние вопрос. Вы не можете удалить этот ответ, поскольку он принят, но, возможно, пометить модератору, чтобы он удалил его за вас? Поскольку у него более 5 голосов, вы сохраните свою репутацию.
Марк Эмери,

0

json_decode ($ jsondata, истина);

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


не имеет отношения к вопросу, заданному OP. OP специально задал проблему с json_encode
кодировкой,

как это не связано? здесь показан пример использования json_encode для преобразования данных в читаемый массив. Вопрос OP: «Как я могу заставить json_encode кодировать мой массив как массив», мой фрагмент кода делает именно это ... Я думаю, что это слово «Encode» вызывает у вас greef? Под «кодировать» он подразумевает «превращается в». Это не повод ставить против.
Роберт Синклер

о, теперь я понимаю вашу точку зрения, что вы, $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); наконец, порекомендовали бы что-то подобное, finallySerializedInArrayFormat = json_encode($unserialize);если это то, что вы намереваетесь, вы правы, но казалось немного запутанным решением.
pg2286

-1

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

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

это не решает проблему, которую пытается задать OP.
pg2286
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.