首页 > 解决方案 > 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)

因为这些是完成该测验的用户。

标签: phparrays

解决方案


正如@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'];
});

推荐阅读