Как создать действительный вывод json с массивом объектов json

Я создал базу данных mySQL с помощью phpMyAdmin на моем локальном сервере. В этой базе данных я сохранил имена и местоположение моих друзей (вместе с идентификатором в качестве первичного ключа для базы данных). Я написал и запустил следующий php-скрипт, чтобы получить эти данные из базы данных и спроецировать их на свой локальный веб-сервер (XAMPP):

<?php

$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);

header('Content-Type: application/json');

$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);

if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo json_encode($row, JSON_PRETTY_PRINT);

    }
}

Однако таким образом я беру такой вывод:

{
    "id": "1",
    "name": "David Belton",
    "location": "New Haven"
}{
    "id": "2",
    "name": "Alex Danson",
    "location": "New York"
}

что в целом не является допустимым выходом json. Я хотел бы получить следующий результат:

[{
        "id": "1",
        "name": "David Belton",
        "location": "New Haven"
    }, {
        "id": "2",
        "name": "Alex Danson",
        "location": "New York"
  }]

(который также является допустимым выходом json)

Как я могу это сделать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
98
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Это происходит потому, что вы выводите каждый объект изолированно от других внутри своего цикла.

while ($row = mysqli_fetch_assoc($result))
    echo json_encode($row, JSON_PRETTY_PRINT); //<-- echo out an isolated JSON object

Вместо этого просто храните все в массиве, пока не закончите, а затем выводите JSON один раз, а не итеративно.

$arr = [];
while ($row = mysqli_fetch_assoc($result)) $arr[] = $row;
json_encode($arr, JSON_PRETTY_PRINT);

Конечно, результат mysqli_fetch_assoc($result) будет таким же, как и $arr, поэтому, возможно, более простым решением будет просто json_encode(mysqli_fetch_assoc($result), JSON_PRETTY_PRINT);? Но +1 за объяснение.

Jaquarh 14.03.2018 13:05

Дело в том, чтобы сохранить извлеченные ассоциативные массивы во внешнем массиве, а затем JSON закодировать этот внешний массив. Это дает результат, который хочет OP.

Mitya 14.03.2018 13:06

Благодарю за ваш ответ. Возможно, мне бы хотелось, чтобы он был менее плотным, но он правильный, так что все в порядке.

Outcast 14.03.2018 13:35

Создайте массив и вставьте эти записи в цикл while. В конце echo json_encode();, чтобы вывод был в правильном формате JSON

$records = array();
if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {

        $records[] = $row;
    }
}
echo json_encode($records, JSON_PRETTY_PRINT);

Сохраните результат в массиве, затем повторите закодированный / отформатированный массив:

<?php

$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);

header('Content-Type: application/json');

$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);

$arr = array();

if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        array_push($arr, $row);
    }
}

echo json_encode($arr, JSON_PRETTY_PRINT);

Или, вместо получения результатов по одному, просто используйте mysqli_fetch_all

if ($resultCheck > 0)
{
    $row = mysqli_fetch_all($result);
    echo json_encode($row, JSON_PRETTY_PRINT);
}

что на самом деле быстрее и использует меньше памяти: http://php.net/manual/en/mysqli-result.fetch-all.php

Это довольно круто (проголосовать за). Однако имейте в виду, что это возвращает массив массивов, а не простой массив.

Outcast 14.03.2018 13:38

Спасибо! Вы правы, это массив массивов, но в вашем принятом ответе $arr также является массивом массивов

IcedAnt 14.03.2018 13:42

Ха-ха, я не понял этого, даже если протестировал ... также я, наконец, использовал второй ответ ...

Outcast 14.03.2018 13:44

Другие вопросы по теме