2017-08-03 81 views
2

我的數據庫中有一個序列化的數組,我已經提取並反序列化了。它有這樣的結構:計數按序列分組的非序列化陣列

array (
    526744 => 
    array (
    'completed' => 13, 
    'total' => 24, 
    'topics' => 
    array (
    ), 
    'lessons' => 
    array (
     526745 => 1, 
     526747 => 1, 
     526749 => 1, 
     526751 => 0, 
     526753 => 0, 
     526755 => 0, 
     526757 => 0, 
     526759 => 0, 
     526761 => 1, 
    ), 
    'last_id' => 526793, 
) 

第一個數字是一個課程編號(實際上有3個課程,我剛剛包括第一個這裏)。

我已經從幾個不同的用戶的數據庫中拉出來,所以我有上述幾次。

我想數數的教訓,以便知道有多少用戶已通過每課。

我有以下代碼:

foreach($results as $result) { 
    $course_progress = unserialize($result->course_progress); 
    $lesson_progress = $course_progress[$course_id][lessons]; 
    print_r(array_count_values($lesson_progress)); 
} 

此輸出這樣的:

Array ([1] => 24) 
Array ([1] => 11 [0] => 13) 
Array ([1] => 13 [0] => 11) 
Array ([1] => 24) 
Array ([1] => 24) 
Array ([1] => 24) 
Array ([1] => 24) 
Array ([1] => 23 [0] => 1) 
Array ([1] => 24) 
Array ([1] => 21 [0] => 3) 
Array ([1] => 24) 
Array ([1] => 24) 
Array ([1] => 24) 
Array ([1] => 24) 
Array ([0] => 21 [1] => 3) 

這顯然是完全錯誤的。但我想不出如何讓它起作用。我認爲問題是我有我的當前代碼的每個用戶單獨的數組可能?

任何幫助將不勝感激。

+0

所以你計算每用戶傳遞的教訓是什麼?或者你想讓每個課程通過用戶數? –

+0

我試圖讓每個課程通過的用戶數。 – DanR

+0

而你分享的對象(第一段代碼片段)是一個特定用戶的課程清單?或每個課程列表總數? –

回答

1

嘗試4:

$users = array(
    'john' => array(
     526744 => array (
      'completed' => 13, 
      'total' => 24, 
      'topics' => 
       array(), 
      'lessons' => 
       array (
        526745 => 1, 
        526747 => 1, 
        526749 => 1, 
        526751 => 0, 
        526753 => 0, 
        526755 => 0, 
        526757 => 0, 
        526759 => 0, 
        526761 => 1, 
       ), 
      'last_id' => 526793, 
     ), 
     526745 => array (
      'completed' => 13, 
      'total' => 24, 
      'topics' => 
       array(), 
      'lessons' => 
       array (
        526745 => 1, 
        526747 => 1, 
        526749 => 1, 
        526751 => 0, 
        526753 => 1, 
        526755 => 0, 
        526757 => 0, 
        526759 => 0, 
        526761 => 1, 
       ), 
      'last_id' => 526793, 
     ), 
    ), 
     'joe' => array(
      526744 => array (
       'completed' => 13, 
       'total' => 24, 
       'topics' => 
        array(), 
       'lessons' => 
        array (
         526745 => 1, 
         526747 => 1, 
         526749 => 1, 
         526751 => 0, 
         526753 => 0, 
         526755 => 0, 
         526757 => 0, 
         526759 => 0, 
         526761 => 1, 
        ), 
       'last_id' => 526793, 
      ), 
      526745 => array (
       'completed' => 13, 
       'total' => 24, 
       'topics' => 
        array(), 
       'lessons' => 
        array (
         526745 => 1, 
         526747 => 1, 
         526749 => 1, 
         526751 => 1, 
         526753 => 1, 
         526755 => 0, 
         526757 => 0, 
         526759 => 0, 
         526761 => 1, 
        ), 
       'last_id' => 526793, 
      ), 
    ) 
); 
$counts = []; 
foreach($users as $userId => $userCourses){ 
    foreach($userCourses as $courseId => $course){ 
     foreach($course['lessons'] as $lessonId => $lesson){ 
      $counts[$courseId][$lessonId] = empty($counts[$courseId][$lessonId]) ? $lesson : $counts[$courseId][$lessonId]+$lesson; 
     } 
    } 
} 

var_dump($counts); 

顯然我的數組鍵(John和JOE)都只是用於測試目的,從而最外面的foreach是可忽略的。

返回:

array (size=2) 
    526744 => 
    array (size=9) 
     526745 => int 2 
     526747 => int 2 
     526749 => int 2 
     526751 => int 0 
     526753 => int 0 
     526755 => int 0 
     526757 => int 0 
     526759 => int 0 
     526761 => int 2 
    526745 => 
    array (size=9) 
     526745 => int 2 
     526747 => int 2 
     526749 => int 2 
     526751 => int 1 
     526753 => int 2 
     526755 => int 0 
     526757 => int 0 
     526759 => int 0 
     526761 => int 2 
+0

稍有誤解。每個數組的頂層(例如526744)實際上是一個課程,而不是用戶。我將其過濾到上面顯示的代碼中的一個特定課程。我提交的原始查詢返回每個用戶的單獨數組。 – DanR

+0

那麼在你的例子中,你期待看到4?由於用戶正在關注/通過該課程的4門課程? –

+0

嗯,我希望看到每個課程的編號旁邊都有1,但是當它循環遍歷所有用戶時,每個課程都會爲每個已經過去的學生增加。 – DanR