Объединить результат запроса MY SQL с несколькими строками для одного и того же идентификатора элемента в одну строку для ответа json - PullRequest
1 голос
/ 02 марта 2020

Я новичок в PHP и Wordpress. Я пытаюсь создать собственный API на Wordpress. У меня есть запрос My Sql, который использует INNER JOIN для объединения двух таблиц и возвращает несколько строк для одного и того же идентификатора элемента. Затем я пытаюсь преобразовать набор результатов в ответ JSON.

Проблема заключается в том, что я получаю новый объект JSON для каждого идентификатора элемента, даже если идентификаторы совпадают.

Пожалуйста, смотрите мой запрос SQL ниже:

SELECT id, title, answer from wp_tb1 wp1 INNER JOIN wp_tb2 wp2 ON wp1.belongs_id = wp2.id

Php код:

$data=array();
$count=0;
foreach($list as $l){
            $data[$count]=array(
            "id" =>$l->id,
            "title"=>$l->title,
            "answer"=> array($l->title),
            );
        ++$count;
    }

JSON результат выглядит так:

"[{"id":"1","title":"Title 1","answer":"True"},{"id":"1","title":"Title 1","answer":"False"}]"

Как видите, значение идентификатора повторяется, как и заголовок. Я хочу, чтобы ответ был что-то вроде

"[{"id":"1","title":"Title 1","answer":{"True","False"}}]"

Любая помощь с запросом или на уровне кода Php будет полезна.

Ответы [ 3 ]

0 голосов
/ 02 марта 2020

Если ваш selection всегда будет упорядочен по идентификатору, а основная цель - собрать соседние записи с ответами, вы можете использовать следующее if statement:

$data = json_decode($data);
$data2=array();
$count=0;
foreach($data as $l){ 
    if ($count % 2 == 0){ 
        $data2[$count]=array(
            "id" =>$l->id,
            "title"=>$l->title,
        );

        $data2[$count]['answer'] = [];
        $data2[$count]['answer'][] = $l->answer;
    } else {
        $data2[$count-1]['answer'][] = $l->answer;
    }

    $count++;  
}

print_r(json_encode($data2,JSON_PRETTY_PRINT));

Демо

Вывод:

[
    {
        "id": "1",
        "title": "Title 1",
        "answer": [
            "True",
            "False"
        ]
    }
]

Если идентификаторы не упорядочены, вам следует использовать другой код.

0 голосов
/ 02 марта 2020

Измените свой l oop на этот:

$data = [];
foreach ($list as $l) {
    $data[$l->id]['id'] = $l->id;
    $data[$l->id]['title'] = $l->title;
    $data[$l->id]['answer'][] = $l->answer;
}
$data = array_values($data);

Это сгруппирует вложенный массив по id и title (я предполагаю, что заголовок одинаков для того же идентификатора) .

$data теперь будет содержать

[{"id":"1","title":"Title 1","answer":["True","False"]}]

См. demo

0 голосов
/ 02 марта 2020

Вот пример, как создать правильный json:

Метод 1:

try {
            // Try Connect to the DB with new MySqli object - Params {hostname, userid, password, dbname}
            $mysqli = new mysqli("localhost", "root", "", "mysqli_examples");


            $statement = $mysqli->prepare("select id, title, answer from table limit 10");


            $statement->execute(); // Execute the statement.
            $result = $statement->get_result(); // Binds the last executed statement as a result.

            echo json_encode(($result->fetch_assoc())); // Parse to JSON and print.

        } catch (mysqli_sql_exception $e) { // Failed to connect? Lets see the exception details..
            echo "MySQLi Error Code: " . $e->getCode() . "<br />";
            echo "Exception Msg: " . $e->getMessage();
            exit(); // exit and close connection.
        }

        $mysqli->close(); // finally, close the connection

Вывод:

{
    "id": "1",
    "title": "Yes pHP",
    "answer": "True",

}

Метод 2:

$return_arr = array();

$fetch = $db->query("SELECT * FROM table"); 

while ($row = $fetch->fetch_array()) {
    $row_array['id'] = $row['id'];
    $row_array['col1'] = $row['col1'];
    $row_array['col2'] = $row['col2'];

    array_push($return_arr,$row_array);
}

echo json_encode($return_arr);

Выход:

[{"id":"1","col1":"col1_value","col2":"col2_value"},{"id":"2","col1":"col1_value","col2":"col2_value"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...