php - PHP - 如何使用 php 和 mysql 在 for 循环中更新数组对象
问题描述
我尝试在 php/mysql 中从两个不同的表中获取一个 json。目的是使用 php/mysql 为 rest API 打印 JSON。
预期的json是:
{
"qid":"1",
"qst":"OK",
"qoption:
[
{"id":"o1","isrt":true},
{"id":"o2","isrt":false},
{"id":"o3","isrt":false},
{"id":"o4","isrt":false}
]
},
{
"qid":"2",
"qst":"OK",
"qoption:
[
{"id":"o1","isrt":flase},
{"id":"o2","isrt":false},
{"id":"o3","isrt":true},
{"id":"o4","isrt":false}
]
}
我对 PHP 的尝试:
if ( isset($_GET['examsid']) && $_GET['examsid'] != "") {
$questions = array();
$conn = dbConnection();
$examsid = $_GET['examsid'];
$result = mysqli_query($conn, "SELECT `id`,`exams_id`,`title` FROM `tblquestions` WHERE exams_id='".$examsid."' ORDER BY RAND()");
if(mysqli_num_rows($result) > 0){
while($q = mysqli_fetch_array($result)){
$questions[] = $q;
}
}
foreach ($questions as $q) {
$options = array();
$oquery = mysqli_query($conn, "SELECT `id`,`question_id`,`title`,`iscorrect` FROM `tbloptions` WHERE `question_id`='".$q['id']."' ORDER BY RAND()");
while($o = mysqli_fetch_array($oquery)){
$options[] = $o;
}
array_push($q['options'], $options);
}
print_r($questions);
}
使用 json_encode($jsonobj) 的当前输出:
{
"0": "1",
"1": "1",
"2": "How many bones comprise the adult human skeleton?",
"3": "2019-04-11 11:18:44",
"4": "0000-00-00 00:00:00",
"id": "1",
"exams_id": "1",
"title": "How many bones comprise the adult human skeleton?",
"c_date": "2019-04-11 11:18:44",
"m_date": "0000-00-00 00:00:00"
},
{
"0": "3",
"1": "1",
"2": "Which of the following is the first calculating device?",
"3": "2019-04-11 11:19:56",
"4": "0000-00-00 00:00:00",
"id": "3",
"exams_id": "1",
"title": "Which of the following is the first calculating device?",
"c_date": "2019-04-11 11:19:56",
"m_date": "0000-00-00 00:00:00"
}
MySQL:问题-
CREATE TABLE `tblquestions` (
`id` int(11) NOT NULL,
`exams_id` varchar(100) CHARACTER SET latin1 NOT NULL,
`title` varchar(500) CHARACTER SET latin1 NOT NULL,
`c_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`m_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
MySQL:选项 -
CREATE TABLE `tbloptions` (
`id` int(11) NOT NULL,
`question_id` int(100) NOT NULL,
`title` varchar(300) NOT NULL,
`iscorrect` varchar(100) CHARACTER SET latin1 NOT NULL,
`c_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`m_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
似乎它只返回一个问题,没有选项也在每个问题上两次推送标题。请任何人帮我解决这个问题。
解决方案
您正在将选项添加到$q
仅在第二个 foreach 循环中可见的变量。请改用您的$questions
阵列。$key => $q
此外,您需要通过添加foreach 头来获取要添加的问题的当前索引。你能告诉我这段代码的输出是什么(我改变了前面提到的一切)吗?
if ( isset($_GET['examsid']) && $_GET['examsid'] != "") {
$questions = array();
$conn = dbConnection();
$examsid = $_GET['examsid'];
$result = mysqli_query($conn, "SELECT * FROM `tblquestions` WHERE exams_id='".$examsid."' ORDER BY RAND()");
if(mysqli_num_rows($result) > 0){
while($q = mysqli_fetch_array($result)){
$questions[] = $q;
}
}
foreach ($questions as $key => $q) {
$options = array();
$oquery = mysqli_query($conn, "SELECT * FROM `tbloptions` WHERE `question_id`='".$q['id']."' ORDER BY RAND()");
while($o = mysqli_fetch_array($oquery)){
$options[] = $o;
}
$questions[$key]['options'] = $options;
}
print_r($questions);
}
推荐阅读
- validation - Flutter TextFormField 验证器
- netlify-cms - 将随机值返回给字段值为空的数据
- c# - 如何在同一解决方案中访问另一个项目的服务
- jquery - Chrome 扩展消息将数据从 popup.js 传递到内容脚本
- android - 如何使用 recyclerView 适配器从微调器获取值
- php - Laravel 导入和 str_replace
- reactjs - 从 asyncstorage 反应原生惰性初始状态
- c# - Visual Studio 扩展中的 KeyNotFoundException
- javascript - API中的VueJS getmethod成功但表在之后没有更新
- xml - cvc-elt.1:找不到元素“DataModel”的声明