phparraysmultidimensional-arrayfilterintersection

Filter a 2d array by a flat whitelist array


I have following situation

I have 2 arrys

Following is answers array

Array ( 
    [0] => Array (
        [id] => 4e28258263d2c4
        [answer] => Study Accounting 
        [question_id_fk] => 4e28258262d100 
        [correct] => 0 
        [result_text] => Thats a right answer 
        [order] => 1 
    ) 
    [1] => Array ( 
        [id] => 4e28258266d896 
        [answer] => New York 
        [question_id_fk] => 4e28258265b752 
        [correct] => 0 
        [score] => 0.00 
        [result_text] => 
        [order] => 1
    ) 
    [2] => Array ( 
        [id] => 4e282582683870 
        [answer] => Yes 
        [question_id_fk] => 4e282582674ba0 
        [correct] => 0 
        [score] => 0.00 
        [hot_answer] => 0 
        [hot_email] => 
        [ordering] => 1 
        [result_text] => 
        [order] => 1 
    ) 
    [3] => Array ( 
        [id] => 4e282582698c23 
        [answer] => 2 
        [question_id_fk] => 4e282582689e80 
        [correct] => 0 
        [score] => 0.00 
        [hot_answer] => 0 
        [hot_email] => 
        [ordering] => 1 
        [result_text] => 
        [order] => 1 
    ) 
    [4] => Array ( 
        [id] => 4e2825826af072 
        [answer] => 1 
        [question_id_fk] => 4e2825826a0371 
        [correct] => 0 
        [score] => 0.00 
        [hot_answer] => 0 
        [hot_email] => 
        [ordering] => 1 
        [result_text] => 
        [order] => 1 
    ) 
    [5] => Array ( 
        [id] => 4e2825826d9638 
        [answer] => NYC 
        [question_id_fk] => 4e2825826ca998 
        [correct] => 0 
        [score] => 0.00 
        [hot_answer] => 0 
        [hot_email] => 
        [ordering] => 1 
        [result_text] => 
        [order] => 1 
    ) 
    [6] => Array ( 
        [id] => 4e2825826d9137 
        [answer] => Dallas 
        [question_id_fk] => 4e2825826ca998 
        [correct] => 0 
        [score] => 0.00 
        [hot_answer] => 0 
        [hot_email] => 
        [ordering] => 1 
        [result_text] => 
        [order] => 1 ) 
)

 

Here is Question List

 Array ( 
[0] => 4e28258262d100
[1] => 4e282582649464
[2] => 4e28258265b752 
[3] => 4e282582674ba0
[4] => 4e282582689e80 )

    foreach($questionList as $question){
        // I want to Get answers in array above which 
        // has $question.question_id = question_id_fk . One question can have multiple
        // answers

//Print Each question Id 
//Print answer , result_text and correct values from all answers found from AnswerList

     }

How do I search all answers for a question id from array . I need to get "correct" and "result_text" values for an answer .


Solution

  • $matches = array_filter ($answerList, function ($answer) use ($question) {
      return $question['id'] == $answer['question_id_fk'];
    });
    

    Now you can access every single entry.

    If you want to reduce the structures to an array of primtive values (the values you are looking for) you ca do something like

    $correct = array_reduce(
      $matches, 
      function ($result, $current) {
        $result[] = $current['correct'];
        return $result;
      }, 
      array()
    );
    

    Update

    I would suggest to reorder your $answerList

    $answerListOrderedByQuestionId = array_reduce (
      $answerList, 
      function ($result, $answer) {
        if (!array_key_exists($answer['question_id_fk'], $result))
          $result[$answer['question_id_fk']] = array();
    
        $result[$answer['question_id_fk']][] = $answer;
    
        return $result;
      }, 
      array()
    );
    

    This should now be an associative array with the key the question-id. Now you can easily access every single answer for a given question.