2

I got 2 arrays:

$big_array = array (
                    array (
                            array (
                                      'correct' => FALSE,
                                      'answer' => 'false answer1'
                            ),
                            array (
                                      'correct' => FALSE,
                                      'answer' => 'false answer2'
                            ),
                            array (
                                      'correct' => FALSE,
                                      'answer' => 'false answer3'
                            ),                  
                            array (
                                      'correct' => TRUE,
                                      'answer' => 'correct answer'
                            )
                    )
);

$small_array = array (
                    array (
                            array (
                                      'correct' => FALSE,
                                      'answer' => 'false answer1'
                            )
                    )
);

I want to make array_diff($big_array, $small_array) but its 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= array (
                    array (
                            array (
                                      'correct' => FALSE,
                                      'answer' => 'false answer2'
                            ),
                            array (
                                      'correct' => FALSE,
                                      'answer' => 'false answer3'
                            ),                  
                            array (
                                      'correct' => TRUE,
                                      'answer' => 'correct answer'
                            )
                    )
);

Any suggestions?

Edgar
  • 1,113
  • 3
  • 16
  • 30
  • 1
    Why do you have arrays that only contain one array? `array_diff($big_array[0], $small_array[0])` doesn't work? – kero May 03 '13 at 12:50
  • first suggestion : post the code that is not working... how else would we be able to tell you what's wrong ? – Laurent S. May 03 '13 at 12:50
  • @bartdude , like i wrote in OP - `array_diff($big_array, $small_array);` @kingkero , the `$big_array` has a lot of arrays, i just showed 1 here because as an example, but it has more than 1 – Edgar May 03 '13 at 12:52

3 Answers3

14

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

liyakat
  • 11,825
  • 2
  • 40
  • 46
  • [`array_udiff()`](http://php.net/array_udiff) would be a better choice.. Just sayin.. – Fr0zenFyr May 11 '15 at 21:51
  • when making the difference of more than 5000 values,The returned array has 2% of its values that miss the 3rd and 4th associative key of the sub-array – lopata Mar 15 '16 at 10:36
  • 1
    If you are going to copy code from elsewhere, please attribute it. This is an exact copy of code posted as a comment on the PHP array_diff [manual page](https://www.php.net/manual/en/function.array-diff). – Nick Dec 28 '19 at 07:56
0

Edited above code check whether or the the arr1 is bigger or arr2 is bigger

function arrayRecursiveDiff($aArray1, $aArray2) {

if(sizeof($aArray1) > sizeof($aArray2))
{
    $small_arr = $aArray2;
    $big_arr = $aArray1;
    $arr1_is_big = 1;
}
else
{
    $small_arr= $aArray1;
    $big_arr = $aArray2;
    $arr1_is_big = 0;
}
$aReturn = array();

foreach ($big_arr as $mKey => $mValue) {
    if (array_key_exists($mKey, $small_arr)) {
        if (is_array($mValue)) {
            $aRecursiveDiff = arrayRecursiveDiff($mValue, $small_arr[$mKey]);
            if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
            }
        else {
            if ($mValue != $small_arr[$mKey]) {
                $aReturn[$mKey] = $mValue;
                }
            }
    } else {
        $aReturn[$mKey] = $mValue;
    }
}
$aReturn["arr1_is_big"] = $arr1_is_big;

return ($aReturn);
} 
0

I just edited the function from Murali Kumar cause I needed one more information. It will check if the arrays are the same size and contains the same values.

function arrayRecursiveDiff($aArray1, $aArray2) {
    if(count($aArray1) > count($aArray2)) {
        $small_arr = $aArray2;
        $big_arr = $aArray1;
        $arr1_is_big = 1;
        $arr2_is_big = 0;
    } elseif(count($aArray1) < count($aArray2)) {
        $small_arr = $aArray1;
        $big_arr = $aArray2;
        $arr1_is_big = 0;
        $arr2_is_big = 1;
    } else {
        $small_arr = $aArray1;
        $big_arr = $aArray2;
        $arr1_is_big = 0;
        $arr2_is_big = 0;
    }
    $aReturn = array();

    foreach($big_arr as $mKey => $mValue) {
        if(array_key_exists($mKey, $small_arr)) {
            if(is_array($mValue)) {
                $aRecursiveDiff = arrayRecursiveDiff($mValue, $small_arr[$mKey]);
                if(count($aRecursiveDiff)) {
                    $aReturn[$mKey] = $aRecursiveDiff;
                }
            } else {
                if($mValue != $small_arr[$mKey]) {
                    $aReturn[$mKey] = $mValue;
                }
            }
        } else {
            $aReturn[$mKey] = $mValue;
        }
    }
    if($arr1_is_big)
        $aReturn["arr1_is_big"] = $arr1_is_big;

    if($arr2_is_big)
        $aReturn["arr2_is_big"] = $arr2_is_big;

    return ($aReturn);
}
Gummibeer
  • 187
  • 3
  • 14