Как создать действительный вывод json, который включает массивы текста

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

$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 = [];

if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        $arr[] = $row;

    }
}

echo json_encode($arr, JSON_PRETTY_PRINT);

Однако таким образом я беру этот вывод для одного человека:

   [{
        "id": "1",
        "name": "David Belton",
        "team": "Boston Celtics"
    }, {
        "id": "1",
        "name": "David Belton",
        "team": "Cleveland Cavaliers"
    }]

Однако я хотел бы получить что-то вроде этого в качестве вывода для каждого конкретного человека:

{
    "id": "1",
    "name": "David Belton",
    "team": ["Boston Celtics", "Cleveland Cavaliers"] 
}

Возможно ли это в PHP?

Если да, то рекомендуется ли это делать с MySQL обратно в базу данных?

Я бы предложил другую структуру базы данных. Одна таблица для пользователей, одна таблица для их избранного (связанная внешним ключом идентификатора пользователя).

ceejayoz 14.03.2018 14:43

Если вы должен храните его в одной таблице (вы не должны), сохраните разделенный запятыми или закодированный в JSON текст нескольких избранных в одной пользовательской записи.

ceejayoz 14.03.2018 14:46

Спасибо @ceejayoz за ваш комментарий. Да, я понимаю, что вы имеете в виду, говоря о внешнем ключе. Однако вы можете написать об этом подробно, если хотите.

Outcast 14.03.2018 14:46

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

Outcast 14.03.2018 14:48

Как это выглядит в MySQL? Я считаю, что вам следует сначала нормализовать таблицу st.

Onur A. 14.03.2018 14:48

@Poete_Maudit Сделать это через JOIN быстро, легко, и вам определенно стоит освоиться.

ceejayoz 14.03.2018 14:49

Хорошо @ceejayoz. Я уважаю это. У вас есть четкая ссылка, объясняющая, как это сделать?

Outcast 14.03.2018 14:51

@Poete_Maudit stackoverflow.com/questions/14902888/…

ceejayoz 14.03.2018 14:53

Хорошо спасибо. Могу я спросить здесь кое-что краткое ?: Зачем нужны две таблицы? Обычно отношения «многие ко многим» используют три стрелки для двух типов вещей.

Outcast 14.03.2018 14:57

Да, если у вас есть таблица teams, вам понадобится user_teams («сводная таблица») или что-то такое, что представляет собой всего лишь пару идентификаторов. Поскольку в настоящее время вы храните их в виде строк в таблице пользователей, я предложил подход с двумя таблицами.

ceejayoz 14.03.2018 15:04

Хорошо, спасибо за помощь. Если вы хотите увидеть более подробно, что я сделал с MySQL, посмотрите здесь: stackoverflow.com/questions/49279952/….

Outcast 14.03.2018 15:15
Стоит ли изучать 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 и хотите разрабатывать...
0
11
47
3

Ответы 3

Вы должны изменить цикл while, чтобы добавить в окончательный массив только уникальные данные на основе столбца ID:

if ($resultCheck > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        if (!isset($arr[$row['id']])) {
            $arr[$row['id']] = $row;
            $arr[$row['id']]['location'] = [$row['location']];
        } else {
            $arr[$row['id']]['location'][] = $row['location'];
        }
    }
}

echo json_encode(array_values($arr), JSON_PRETTY_PRINT);

Но вы должны принять во внимание то, что прокомментировал @ceejayoz.

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

$sql = 'SELECT id, name, GROUP_CONCAT(team) as team FROM friends GROUP BY id;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);

arr = [];

if ($resultCheck > 0) {
    $key = 0;
    while ($row = mysqli_fetch_assoc($result)) {
        $arr[$key] = $row;
        $arr[$key]['team'] = explode(",", $row['team']);
        $key++;
    }
}

echo json_encode($arr, JSON_PRETTY_PRINT);

Типичный способ сделать это - иметь таблицу users и таблицу user_favorites. Храните пользовательские элементы в users, и user_favorites будет чем-то вроде user_id: 1, team: Boston Celtics.

В качестве альтернативы (и менее оптимальной) вы можете сохранить несколько избранных в одной записи users. В зависимости от ваших данных, будет работать представление CSV (Boston Celtics,Cleveland Cavaliers) или, возможно, поле TEXT, в котором вы храните строку в кодировке JSON (["Boston Celtics", "Cleveland Cavaliers"]).

Обратной стороной этого подхода является то, что он труднее индексируется базой данных MySQL, поэтому SELECT * FROM users WHERE favorite LIKE '%Boston Celtics%' не будет очень быстрым при большом количестве пользователей.

нет .. должно быть 3 таблицы: users, teams, users_favorite_teams .. столбцы более поздней таблицы - только user_id, team_id

Mihai Matei 14.03.2018 14:56

@MateiMihai В целом я согласен, но не ясно, что OP имеет / нуждается в таблице teams вообще. Это могут быть какие-то данные профиля с произвольным текстом.

ceejayoz 14.03.2018 15:05

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