Search code examples
phparraysmultidimensional-arrayfilterarray-difference

Filter out differences between correlated data sets from two multidimensional arrays


I have 2 arrays:

$big_array = [
    [
        ['correct' => FALSE, 'answer' => 'false answer1'],
        ['correct' => FALSE, 'answer' => 'false answer2'],
        ['correct' => FALSE, 'answer' => 'false answer3'],
        ['correct' => TRUE, 'answer' => 'correct answer'],
    ]
];

$small_array = [
    [
        ['correct' => FALSE, 'answer' => 'false answer1'],
    ]
];

I want to make array_diff($big_array, $small_array) but it's not working how I want it to.

Currently, it gives me an empty array as a result, where I want the outcome to be:

$outcome_array = [
    [
        ['correct' => FALSE, 'answer' => 'false answer2'],
        ['correct' => FALSE, 'answer' => 'false answer3'],
        ['correct' => TRUE, 'answer' => 'correct answer'],
    ]
];

Solution

  • yes you can use below function to get you perfect answer

    function arrayRecursiveDiff($aArray1, $aArray2) {
      $aReturn = array();
    
      foreach ($aArray1 as $mKey => $mValue) {
        if (array_key_exists($mKey, $aArray2)) {
          if (is_array($mValue)) {
            $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
            if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
          } else {
            if ($mValue != $aArray2[$mKey]) {
              $aReturn[$mKey] = $mValue;
            }
          }
        } else {
          $aReturn[$mKey] = $mValue;
        }
      }
      return $aReturn;
    } 
    
      $arr1 =    arrayRecursiveDiff($big_array,$small_array);
    

    output

    as you need

    Array
    
    (
        [0] => Array
            (
                [1] => Array
                    (
                        [correct] => 
                        [answer] => false answer2
                    )
    
                [2] => Array
                    (
                        [correct] => 
                        [answer] => false answer3
                    )
    
                [3] => Array
                    (
                        [correct] => 1
                        [answer] => correct answer
                    )
    
            )
    
    )
    

    check here for more info