Php 将两个表的结果合并到JSON数据中

Php 将两个表的结果合并到JSON数据中,php,mysql,json,Php,Mysql,Json,我有两张表格,单词和段落。词语表如下: +----+---------+--------------+--------+ | id | word_no | paragraph_no | word | +----+---------+--------------+--------+ | 1 | 1 | 1 | hello | +----+---------+--------------+--------+ | 2 | 2 | 1

我有两张表格,单词和段落。词语表如下:

+----+---------+--------------+--------+
| id | word_no | paragraph_no |  word  |
+----+---------+--------------+--------+
|  1 |    1    |       1      |  hello |
+----+---------+--------------+--------+
|  2 |    2    |       1      |  how   |
+----+---------+--------------+--------+
|  3 |    3    |       1      |  are   |
+----+---------+--------------+--------+
|  4 |    4    |       1      |  you   |
+----+---------+--------------+--------+
+----+--------------+-------------------+
| id | paragraph_no |     paragraph     |
+----+--------------+-------------------+
|  1 |       1      | hello how are you |
+----+--------------+-------------------+
段落表如下所示:

+----+---------+--------------+--------+
| id | word_no | paragraph_no |  word  |
+----+---------+--------------+--------+
|  1 |    1    |       1      |  hello |
+----+---------+--------------+--------+
|  2 |    2    |       1      |  how   |
+----+---------+--------------+--------+
|  3 |    3    |       1      |  are   |
+----+---------+--------------+--------+
|  4 |    4    |       1      |  you   |
+----+---------+--------------+--------+
+----+--------------+-------------------+
| id | paragraph_no |     paragraph     |
+----+--------------+-------------------+
|  1 |       1      | hello how are you |
+----+--------------+-------------------+
我希望单词表中的所有列,其中段落_no为1,以及段落表中具有相同WHERE子句的段落列都在一个JSON结果中。大概是这样的:

{
    "1": [ <-- this is the paragraph number

        "words": [

            {
                "id": "1",
                "word_no": "1",
                "paragraph_no": "1",
                "word": "hello"
            },
            {
                "id": "2",
                "word_no": "2",
                "paragraph_no": "1",
                "word": "how"
            },

            // and so on...

        ],

        "paragraph": [

            {
                "paragraph": "hello how are you"
            }

        ]

    ]
}
{
    "1": [ <-- this is the paragraph number

        {
            "id": "1",
            "word_no": "1",
            "paragraph_no": "1",
            "word": "hello"
        },
        {
            "id": "2",
            "word_no": "2",
            "paragraph_no": "1",
            "word": "how"
        },

        // and so on...

    ]
}
它只输出以下文字:

{
    "1": [ <-- this is the paragraph number

        "words": [

            {
                "id": "1",
                "word_no": "1",
                "paragraph_no": "1",
                "word": "hello"
            },
            {
                "id": "2",
                "word_no": "2",
                "paragraph_no": "1",
                "word": "how"
            },

            // and so on...

        ],

        "paragraph": [

            {
                "paragraph": "hello how are you"
            }

        ]

    ]
}
{
    "1": [ <-- this is the paragraph number

        {
            "id": "1",
            "word_no": "1",
            "paragraph_no": "1",
            "word": "hello"
        },
        {
            "id": "2",
            "word_no": "2",
            "paragraph_no": "1",
            "word": "how"
        },

        // and so on...

    ]
}

如何获得所需的JSON输出?

为了获得所需的结构,您需要执行两条SQL语句——一条用于获取所有单词,另一条用于获取所有段落

$result_w = $conn->query("SELECT * FROM words;");
$results_w = $result->fetch_all(MYSQLI_ASSOC);

$result_p = $conn->query("SELECT * FROM paragraphs;");
$results_p = $result->fetch_all(MYSQLI_ASSOC);

$paragraphs = [];
foreach($results_p as $key => $row) {
  $paragraphs[$row['id']] = $row;
}

$data = [];

foreach($results_w as $key => $row) {
  $p_no = $row['paragraph_no'];
  $data[$p_no]['words'] = $results_w;
  $data[$p_no]['paragraph'] = $paragraphs[$p_no];
}

您现在需要$data的输出吗?

谢谢您的回答。您的解决方案几乎可以正常工作,只是现在表中的所有单词都显示在每个段落JSON数组中。我的意思是,它向我展示了:第1段->表格中的所有单词,第2段->表格中的所有单词。然而,我想要的是:第1段->仅第1段文字,第2段->仅第2段文字。我甚至尝试在sql查询中添加WHERE子句,但没有成功。希望我说得清楚。我实际上意识到这个问题是我在问题中没有提到的专栏,因为我认为没有必要,但事实确实如此。稍后我可能会再次提出这个问题,并提供所有细节。感谢您的解决方案,因为它几乎可以正常工作。但由于我犯了一个错误,它不能完全起作用。我又问了一次这个问题。如果您能在那里为我提供一个解决方案,那将很有帮助: