PHP-масив до масиву JSON за допомогою json_encode ();


77

Я закодував масив, який я створив, використовуючи вбудовану json_encode();функцію. Мені це потрібно у форматі масиву масивів приблизно так:

[["Afghanistan",32,12],["Albania",32,12]]

Однак він повертається як:

["2":["Afghanistan",32,12],"4":["Albania",32,12]]

Як я можу видалити ці номери рядків, не використовуючи жодної хитрості Regex?


Чи можете ви показати нам більше коду, щоб ми мали уявлення про те, що ще ви робите?
Джим

5
["2":["Afghanistan",32,12],"4":["Albania",32,12]]навіть не дійсний JSON, тому я сумніваюся, що ви це зрозуміли. Якщо ваш масив верхнього рівня асоціативний, просто зателефонуйте, array_values()щоб отримати послідовні індексовані елементи.
Фелікс Клінг,

цікавить і цю тему: php.net/manual/en/function.json-encode.php#105923
Бен,

Відповіді:


172

Якщо ключі масиву у вашому масиві PHP не є послідовними числами, json_encode() необхідно зробити іншу конструкцію об'єктом, оскільки масиви JavaScript завжди послідовно числово індексуються.

Використовуйте array_values()на зовнішній структурі в PHP, щоб відкинути оригінальні ключі масиву та замінити їх нульовою послідовною нумерацією:

Приклад:

// Non-consecutive 3number keys are OK for PHP
// but not for a JavaScript array
$array = array(
  2 => array("Afghanistan", 32, 13),
  4 => array("Albania", 32, 12)
);

// array_values() removes the original keys and replaces
// with plain consecutive numbers
$out = array_values($array);
json_encode($out);
// [["Afghanistan", 32, 13], ["Albania", 32, 12]]

1
Я закінчив тут, коли дізнався, що json_encode перетворив масив на об'єкт без видимих ​​причин, коли в масиві є лише один елемент після фільтрування array_filter. Я не знаю, чи має індекс масиву щось спільного з цією огидною php-помилкою php, але array_values ​​розібрав це для мене. Відтепер .. немає json_encode масиву, щоб не було викликано array_values.
Mar Bar

@MarBar Якщо масив має нечисловий рядовий ключ або числовий ключ поза послідовністю , json_encode()буде створено {}об'єкт, а не масив, []оскільки JavaScript / JSON не має іншого способу представити таку структуру. Але так, ви можете позбавити ключів, array_keys()якщо вони не потрібні в результуючому рядку json.
Michael Berkowski

@MichaelBerkowski: я отримую ту саму проблему із складеним первинним ключем з таблиці db, де мені потрібно спочатку зробити: mysqli_fetch_assocа потім array_values... мені цікаво, чи це найефективніший спосіб отримати справжні масиви з великою кількістю даних ... чи слід переписувати свій власний json_encode? яка ваша (оцінена) думка з цього приводу?
deblocker

1
@deblocker Важко вгадати складну клавішу години. Як правило array_*(), всі функції PHP дуже ефективні. На невеликому масиві я, як правило, вважаю за краще використовувати декілька функцій array_ * з однією дією, якщо можу уникнути циклів. Але якщо ваш mysqli_result великий, ви, можливо, не захочете компілювати все це одразу в масив, а потім зателефонуйте array_values(). Натомість вам може бути краще додати рядки до масиву під час отримання. Хоча всі спекуляції, бо я не знаю, як виглядає ваш код.
Michael Berkowski

1
@Gem Це дуже залежить від структури XML, який вам потрібно створити, оскільки елементи XML повинні бути якось іменовані. Є приклади у stackoverflow.com/questions/1397036/…
Michael Berkowski

18

Функція json_encode () допоможе вам кодувати масив у форматі JSON у php.

якщо ви будете використовувати лише функцію json_encode безпосередньо без будь-якої конкретної опції, вона поверне масив. Як згадане вище питання

$array = array(
  2 => array("Afghanistan",32,13),
  4 => array("Albania",32,12)
);
$out = array_values($array);
json_encode($out);
// [["Afghanistan",32,13],["Albania",32,12]]

Оскільки ви намагаєтесь перетворити Array в JSON, тоді я б запропонував використовувати JSON_FORCE_OBJECT як додаткову опцію (параметри) у json_encode , як нижче

<?php
$array=['apple','orange','banana','strawberry'];
echo json_encode($array, JSON_FORCE_OBJECT);
// {"0":"apple","1":"orange","2":"banana","3":"strawberry"} 
?>

1
Дякую, JSON_FORCE_OBJECT був дуже
корисним

6

Я хочу додати до відповіді Майкла Берковського, що це також може статися, якщо порядок масиву буде змінено, і в цьому випадку спостерігати за проблемою трохи складніше, оскільки в об'єкті json порядок буде впорядкований за зростанням.

Наприклад:

[
    3 => 'a',
    2 => 'b',
    1 => 'c',
    0 => 'd'
]

Повернеться:

{
    0: 'd',
    1: 'c',
    2: 'b',
    3: 'a'
}

Тож рішенням у цьому випадку є використання array_reverseперед кодуванням у json


Я думаю, що array_valuesрішення, написане @Michael Berkowski, є більш універсальним, і воно працює також у вашому випадку.
Jacopo Pace

0

Якщо ви не вказали індекси у своєму початковому масиві, ви отримаєте звичайні числові. Масиви повинні мати певний вигляд унікального індексу


0

Типовим використанням JSON є читання даних з веб-сервера та відображення даних на веб-сторінці.

У цьому розділі ви дізнаєтеся, як обмінюватися даними JSON між клієнтом та сервером PHP.

PHP має деякі вбудовані функції для обробки JSON.

Об'єкти в PHP можуть бути перетворені в JSON за допомогою функції PHP json_encode ():

<?php
$myObj->name = "John";
$myObj->age = 30;
$myObj->city = "New York";

$myJSON = json_encode($myObj);

echo $myJSON;
?>


0

У мене була проблема з наголошеними символами при перетворенні масиву PHP у JSON. Я поклав речі UTF-8 скрізь, але ніщо не вирішило моєї проблеми, поки я не додав цей шматок коду в мій цикл PHP while, куди я штовхав масив:

$es_words[] = array(utf8_encode("$word"),"$alpha","$audio");

Проблему викликала лише змінна '$ word'. Згодом це зробило jason_encode без проблем.

Сподіваюся, що це допомагає

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