Функция array_diff_keys() не совсем так работает. Нужно чтобы результатом было полное расхождение. Т.е. все элементы из А которые отсутствуют в B и все элементы из B которые отсутствуют в А.
Т.е. так:
array_merge(array_diff_keys($a, $b), array_diff_keys($b, $a));
Есть ли проще варианты ?
array_diff_keys эквивалент операции над множествами "разность"
A\B={x|(x in A) and (x non in B)}
Вы хотите операцию симметрической разности:
A delta B = {x|(x in A and x in B) and (x not in AB)}
Соответственно симметрическая разность так и реализуется:
A delta B=(A\B)+(B\A)
array_merge(array_diff_keys($a, $b), array_diff_keys($b, $a));
В PHP реализованы операции объединения (array_merge), пересечения (array_intersect) и разности (array_diff). Остальные операции над множествами реализуются через их композицию.
Если вы хотите получить только уникальные различия, то можно дополнительно обернуть в array_unique.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей