Time for a lesson in basic PHP.
A bug was introduced in r25374 by Aaron, last September, and despite half a dozen people editing the few lines around that point, nobody picked it up. Simetrical eventually fixed it in r29156, blaming a bug in PHP's array_diff(). It was not.
$permErrors += array_diff( $this->mTitle->getUserPermissionsErrors('create', $wgUser), $permErrors );
I used to make the same error myself. Although I learnt from my mistakes, we obviously haven't learnt as a team.
http://www.php.net/manual/en/language.operators.array.php
"The + operator appends elements of remaining keys from the right handed array to the left handed, whereas duplicated keys are NOT overwritten."
That explains the behaviour of the array plus operator in its entirety. If you add two arrays, and both have an element with a key of zero, the one on the left-hand side wins. The elements are NOT renumbered.
For example:
print_r( array( 'foo' ) + array( 'bar' ) );
Array ( [0] => foo )
print_r( array( 'foo' ) + array( 'bar', 'baz' ) );
Array ( [0] => foo [1] => baz )
If you want the elements to be renumbered, use array_merge().
-- Tim Starling