Sí, conserva la orden. puedes pensar en arreglos php como ordered hash maps.
Puede pensar en los elementos ordenados por "tiempo de creación de índice". Por ejemplo
$a = array();
$a['x'] = 1;
$a['y'] = 1;
var_dump($a); // x, y
$a = array();
$a['x'] = 1;
$a['y'] = 1;
$a['x'] = 2;
var_dump($a); // still x, y even though we changed the value associated with the x index.
$a = array();
$a['x'] = 1;
$a['y'] = 1;
unset($a['x']);
$a['x'] = 1;
var_dump($a); // y, x now! we deleted the 'x' index, so its position was discarded, and then recreated
En resumen, si va a añadir una entrada donde un duerma clave existe actualmente en la matriz, la posición de la entrada será el final de la lista. Si está actualizando una entrada para una clave existente, la posición no cambia.
foreach realiza un bucle sobre las matrices utilizando el orden natural demostrado anteriormente. También puede usar next() current() prev() reset() y amigos, si lo desea, aunque raramente se utilizan desde que se introdujo foreach en el idioma.
también, print_r() y var_dump() producen sus resultados usando el orden de matriz natural también.
Si está familiarizado con Java, LinkedHashMap es la estructura de datos más similar.