php - PHP - 检查数组中是否存在 JSON 值,如果存在则获取关联的 user_id
问题描述
我在我的网站上创建了一个测验,并将测验结果作为 JSON 元素存储在我的数据库中。然后,我将创建一个 PHP 数组,其中包含用户 ID 以及他们参加的测验及其结果。数组如下所示:
Array (
[0] => Array (
[user_id] => 167
[quizzes_complete] => [{"ID":"210","date":"01/31/19","score":"8"},{"ID":"202","date":"07/30/20","score":"10"}]
)
[1] => Array (
[user_id] => 686
[quizzes_complete] => [{"ID":"83","date":"03/27/19","score":"9"}]
)
[2] => Array (
[user_id] => 279
[quizzes_complete] => [{"ID":"210","date":"03/27/19","score":"7"}]
)
[3] => Array (
[user_id] => 239
[quizzes_complete] => [{"ID":"83","date":"03/27/19","score":"8"}]
)
)
我想做的是遍历这个数组并搜索一个特定的测验ID
,然后user_id
为完成该特定测验的用户构建一个 s 数组。因此,假设我想找到user_id
完成测验的每个用户的 ID 210
,我将如何构建该用户数组?这是我尝试过的,但我认为我还很遥远:
$usersCompletedQuiz = array();
for($i = 0; $i < count($userCompletedQuizzes); $i++) {
if (in_array('"ID":"210"', $userCompletedQuizzes)) {
array_push($usersCompletedQuiz, 'user_id');
}
}
对于测验210
,我希望$usersCompletedQuiz
数组看起来像这样:
(167,279)
因为这些是完成该测验的用户。
解决方案
正如@AbraCadaver所说,理想的是将带有测验信息的json插入一个表中,每个索引都是一列。这样就可以通过数据库中的查询获得所需的数据。
但是,如果您此时无法执行此操作,以下是如何获得所需内容的代码:
// Array of users, with id and completed quizzes.
$userCompletedQuizzes = array(
array(
'user_id' => 167,
'quizzes_complete' => '[{"ID":"210","date":"01/31/19","score":"8"},{"ID":"202","date":"07/30/20","score":"10"}]'
),
array(
'user_id' => 686,
'quizzes_complete' => '[{"ID":"83","date":"03/27/19","score":"9"}]'
),
array(
'user_id' => 279,
'quizzes_complete' => '[{"ID":"210","date":"03/27/19","score":"7"}]'
),
array(
'user_id' => 239,
'quizzes_complete' => '[{"ID":"83","date":"03/27/19","score":"8"}]'
),
);
$quizId = 210; // The requested quiz id
$usersCompletedQuiz = array();
foreach($userCompletedQuizzes as $key => $userInfo) {
/*
Convert the json with the data of the
completed quizzes and return the id and date
of each one to the variable $userQuizzes
*/
$userQuizzes = array_map(function($ui) {
return ['id' => $ui->ID, 'date' => $ui->date];
}, json_decode($userInfo['quizzes_complete']));
// Check if the required id is in the user's quizzes array
foreach($userQuizzes as $uq) {
if($quizId == $uq['id']) {
array_push(
$usersCompletedQuiz,
[
'user_id' => $userInfo['user_id'],
'date' => DateTime::createFromFormat('m/d/y', $uq['date'])->format('Y-m-d')
]
);
}
}
}
print_r($usersCompletedQuiz);
结果:
Array
(
[0] => 167
[1] => 279
)
排序示例:
usort($usersCompletedQuiz, function($u1, $u2) {
if($u1['date'] == $u2['date']) return $u1['user_id'] > $u2['user_id'];
return $u1['date'] > $u2['date'];
});
推荐阅读
- mongodb - 日期包含非零时间戳的 Mongodb 文档
- javascript - 异步函数中javascript中的暂停和取消暂停循环
- c# - 编辑 ListBox 项中现有对象的属性 C#
- php - 您知道为什么会出现“此集合实例上不存在属性 [registrationType]”吗?
- entity-relationship - 关于 EER 模型中的子类型
- php - laravel 使用具有特定角色的 get()
- html - p标签随机出现在屏幕角落
- javascript - 用 expo 反应原生:'反应导航在急速模块图中不存在'
- javascript - 当我在 ES6/react 中使用 moment.tz() 时失败?
- spring - 使用外键保存实体