2017-08-03 20 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, 
) 

最初の数字はコースIDです(実際にはここで最初に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:最も外側のforeachが無視できるよう

$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); 

明らかマイ配列のキー(ジョンとジョー)は単にテスト目的のためのものです。

戻り値:

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)は、実際にはコースであり、ユーザーではありません。私は上記のコードの1つの特定のコースにそれをフィルタリングしています。私が提出した元のクエリは、各ユーザの個別の配列を返します。 – DanR

+0

あなたの例では、あなたは4を見ることを期待していますか?ユーザーはそのコースで4レッスンをフォローしていますか? –

+0

私は、各レッスンのIDに隣に1が表示されることを期待していますが、すべてのユーザーをループするにつれて、各レッスンは通過したすべての生徒にとって増加します。 – DanR

関連する問題