簡體   English   中英

在多維數組中找到最高值並保持最高值

[英]Find highest value in multidimensional array and keep highest

如何從數組中獲取最高值? 例如,我試圖獲得每個測驗的最高結果,而不是同一測試的多個結果。

我有一個看起來像這樣的數組:

[
   {
      "ID":"806",
      "user_login":"123456789",
      "post_title":"Foo Test 1",
      "display_name":"John Doe",
      "activity_meta_value":"100",
      "activity_completed":"1543142130"
   },
   {
      "ID":"806",
      "user_login":"123456789",
      "post_title":"Foo Test 2",
      "display_name":"John Doe",
      "activity_meta_value":"75",
      "activity_completed":"1543144312"
   },
   {
      "ID":"806",
      "user_login":"123456789",
      "post_title":"Foo Test 2",
      "display_name":"John Doe",
      "activity_meta_value":"75",
      "activity_completed":"1543144528"
   },
   {
      "ID":"1167",
      "user_login":"987654321",
      "post_title":"Foo Test 2",
      "display_name":"Karen Eliot",
      "activity_meta_value":"75",
      "activity_completed":"1543156089"
   },
   {
      "ID":"1167",
      "user_login":"987654321",
      "post_title":"Foo Test 2",
      "display_name":"Karen Eliot",
      "activity_meta_value":"100",
      "activity_completed":"1543156480"
   }
]

然后我將數組重新排列為以下結構以使其更易於使用。 這是我重新排列后數組的輸出。

[
   {
      "id":"806",
      "user_login":"123456789",
      "user_name":"John Doe",
      "quizes":[
         {
            "quiz":"Foo Test 1",
            "score":"90",
            "quiz_completed":"1543141990"
         },
         {
            "quiz":"Foo Test 1",
            "score":"100",
            "quiz_completed":"1543142130"
         },
         {
            "quiz":"Foo Test 2",
            "score":"75",
            "quiz_completed":"1543144312"
         },
         {
            "quiz":"Foo Test 2",
            "score":"75",
            "quiz_completed":"1543144528"
         }
      ]
   },
   {
      "id":"1167",
      "user_login":"987654321",
      "user_name":"Karen Eliot",
      "quizes":[
         {
            "quiz":"Foo Test 2",
            "score":"75",
            "quiz_completed":"1543156089"
         },
         {
            "quiz":"Foo Test 2",
            "score":"100",
            "quiz_completed":"1543156480"
         }
      ]
   }
]

我通過使用以下函數來做到這一點:

function student_scores( $data ) {
    global $wpdb;
    $quizzes = $wpdb->get_results( " SELECT $wpdb->users.ID, $wpdb->users.user_login, $wpdb->posts.post_title, $wpdb->users.display_name, " . $wpdb->prefix . "learndash_user_activity_meta.activity_meta_value, " . $wpdb->prefix . "learndash_user_activity.activity_completed
    FROM " . $wpdb->prefix . "learndash_user_activity
      INNER JOIN $wpdb->users ON " . $wpdb->prefix . "learndash_user_activity.user_id = $wpdb->users.ID
      INNER JOIN " . $wpdb->prefix . "learndash_user_activity_meta ON " . $wpdb->prefix . "learndash_user_activity.activity_id = " . $wpdb->prefix . "learndash_user_activity_meta.activity_id
      INNER JOIN $wpdb->posts ON " . $wpdb->prefix . "learndash_user_activity.post_id = $wpdb->posts.ID
      INNER JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id
    WHERE " . $wpdb->prefix . "learndash_user_activity.activity_type = 'quiz' AND " . $wpdb->prefix . "learndash_user_activity_meta.activity_meta_key = 'percentage' AND " . $wpdb->prefix . "usermeta.meta_value = " . $data['id'] . "GROUP BY " . $wpdb->prefix . "learndash_user_activity.activity_id ", ARRAY_A );

    $out = array();
    foreach ( $quizzes as $x ) {
        $out[ $x['ID'] ]['id']         = $x['ID'];
        $out[ $x['ID'] ]['user_login'] = $x['user_login'];
        $out[ $x['ID'] ]['user_name']  = $x['display_name'];
        $out[ $x['ID'] ]['quizes'][]   = array(
            'quiz'           => $x['post_title'],
            'score'          => $x['activity_meta_value'],
            'quiz_completed' => $x['activity_completed']
        );
    }

    if ( empty( $out ) ) {
        return new WP_Error(
            'no_students',
            'invalid group',
            array(
                'status' => 404
            )
        );
    }

    return array_values( $out );
}

我想為每個用戶的每個測試獲得最高值。 每個用戶有 2 個測驗,我想在同一個測試中獲得更高的分數。 例如,如果用戶參加了兩次 Foo Test 1 測驗,第一次得到 50,第二次得到 70,我只想返回 Foo Test 1 的 70。

我希望我的問題足夠清楚。 提前致謝。

通過為每個用戶安排測試元素,您已經完成了大部分工作。 剩下的就是過濾這個列表。

考慮您有這個“測試元素”列表:(如您的示例中的John Doe

$a = array("quiz" => "Foo Test 1", "score" => "90");
$b = array("quiz" => "Foo Test 1", "score" => "100");
$c = array("quiz" => "Foo Test 2", "score" => "75");
$d = array("quiz" => "Foo Test 2", "score" => "75");
$quizes = array($a, $b, $c, $d);

您可以通過以下方式縮小范圍:

$res = array();
foreach($quizes as $quize) {
        if (!isset($res[$quize["quiz"]]) || ($res[$quize["quiz"]]["score"] < $quize["score"])) // is first test or this test higher then the previous  
                $res[$quize["quiz"]] = $quize;
}
$res = array_values($res); // because all you want are the quiz elements

現在$res將輸出:

Array
(
    [0] => Array
        (
            [quiz] => Foo Test 1
            [score] => 100
        )
    [1] => Array
        (
            [quiz] => Foo Test 2
            [score] => 75
        )
)

希望有幫助!

已編輯

定義以下函數:

function filterQuizesByScore($quizes) {
        $res = array();
        foreach($quizes as $quize) {
        if (!isset($res[$quize["quiz"]]) || ($res[$quize["quiz"]]["score"] < $quize["score"]))
                $res[$quize["quiz"]] = $quize;
        }
        return array_values($res);
}

student_scores函數中使用它。 foreach ( $quizzes as $x )范圍之后添加新循環為:

foreach($out as &$elem) {
    $elem["quizes"] = filterQuizesByScore($elem["quizes"]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM