public static function diff($array1, $array2)
{
$array1 = (array) $array1;
$array2 = (array) $array2;
foreach ($array1 as $key => $value) {
if (TRUE === isset($array2[$key])) {
if (TRUE === is_array($value) && TRUE === is_array($array2[$key])) {
$diff = self::diff($value, $array2[$key]);
if (0 === count($diff)) {
unset($array1[$key]);
} else {
$array1[$key] = $diff;
}
} elseif ($value == $array2[$key]) {
unset($array1[$key]);
}
unset($array2[$key]);
}
}
foreach ($array2 as $key => $value) {
if (FALSE === isset($array1[$key])) {
$array1[$key] = $value;
}
}
return $array1;
}
/** * @test */ public function canOperateArrayDiffFunction() { $array1 = array('bar' => TRUE, 'baz' => TRUE, 'same' => array('foo' => TRUE), 'foo' => array('bar' => TRUE, 'foo' => TRUE)); $array2 = array('bar' => TRUE, 'baz' => FALSE, 'new' => TRUE, 'same' => array('foo' => TRUE), 'foo' => array('bar' => TRUE)); $expected = array('baz' => TRUE, 'foo' => array('foo' => TRUE), 'new' => TRUE); $product = RecursiveArrayUtility::diff($array1, $array2); $this->assertSame($expected, $product); }