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

Arrayв JSONіндексується масив тільки , тому структура ви намагаєтеся отримати не є дійсним Json / Javascript.

Масив асоціаторів PHP - це об'єкти в 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 масив у відповідь Мартіна це фактично індексовані, неявно. Опущення індексу призводить до індексованого масиву, починаючи з нуля.
Борис Гері

Ця відповідь не зовсім передбачала те, чого хотіла ОП під час опублікування запитання (не дивно, оскільки те, що хотіла ОП, було неможливо), і їх зміни до цього часу залишали цю відповідь, здавалося б, неправильно, враховуючи поточний стан питання. Ви не можете видалити цю відповідь, оскільки вона прийнята, але, можливо, позначте модератора, щоб видалити її для вас? Оскільки у нього понад 5 обновлених результатів, ви збережете представника.
Марк Амері

0

json_decode ($ jsondata, true);

true перетворює всі властивості на масив (послідовний чи ні)


не стосується питання, заданого ОП. OP спеціально запитав проблему кодування, що виникає при використанніjson_encode
pg2286

як це не пов’язано? це показує приклад використання json_encode, тому він перетворює дані в читабельний масив. Питання ОП: "Як я можу змусити json_encode кодувати свій масив як масив", мій біт коду робить саме це. Під «кодуванням» він означає «перетворюється на». Це не є причиною зворотного голосування.
Роберт Сінклер

Про , я бачу вашу точку зараз, що б ви порекомендували що - щось на зразок цього , $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)); 
?>

це не вирішує питання, про яке намагається поставити ОП.
pg2286
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.