PHP anteponer matriz asociativa con claves literales?

112

¿Es posible anteponer una matriz asociativa con pares literal clave => valor? Sé que array_unshift () funciona con claves numéricas, pero espero algo que funcione con claves literales.

Como ejemplo, me gustaría hacer lo siguiente:

$array1 = array('fruit3'=>'apple', 'fruit4'=>'orange');
$array2 = array('fruit1'=>'cherry', 'fruit2'=>'blueberry');

// prepend magic

$resulting_array = ('fruit1'=>'cherry', 
                    'fruit2'=>'blueberry', 
                    'fruit3'=>'apple', 
                    'fruit4'=>'orange');
Colin Brock
fuente

Respuestas:

219

¿No puedes simplemente hacer:

$resulting_array = $array2 + $array1;

?

cletus
fuente
15
Consulte también array_merge () y su diferencia con el operador +: br.php.net/manual/en/function.array-merge.php#92602
Havenard
2
@cletus: Joder. Sí puedo. No estoy seguro de qué me hizo pensar que no podía o qué no funcionaba antes. Gracias por la respuesta.
Colin Brock
Vale la pena señalar la diferencia, pero esa diferencia es relevante para preservar las claves numéricas y esta matriz es una matriz asociativa "pura" con claves de cadena.
cletus
29

La respuesta es no. No puede anteponer una matriz asociativa con un par clave-valor.

Sin embargo, puede crear una nueva matriz que contenga el nuevo par clave-valor al comienzo de la matriz con el operador de unión +. Sin embargo, el resultado es una matriz completamente nueva y la creación de la nueva matriz tiene una complejidad O (n).

La sintaxis está a continuación.

$new_array = array('new_key' => 'value') + $original_array;

Nota: No utilice array_merge (). array_merge () sobrescribe las claves y no conserva las claves numéricas.

PHPguru
fuente
"sobrescribe las claves y no conserva las claves numéricas" ... a) ¿cómo maneja el operador de unión ("+") las claves "duplicadas"? re: no conservar las teclas numéricas: probablemente deseado
Brad Kent
16

En su situación, desea utilizar array_merge ():

array_merge(array('fruit1'=>'cherry', 'fruit2'=>'blueberry'), array('fruit3'=>'apple', 'fruit4'=>'orange'));

Para anteponer un solo valor, para una matriz asociativa, en lugar de array_unshift (), use de nuevo array_merge ():

array_merge(array($key => $value), $myarray);
mvpetrovich
fuente
5

@Cletus da en el clavo. Solo para agregar, si el orden de los elementos en las matrices de entrada es ambiguo y necesita que se ordene la matriz final, es posible que desee ksort :

$resulting_array = $array1 + $array2;
ksort($resulting_array);
karim79
fuente
4
Como nota tardía, ksortdevuelve un valor booleano, por lo que lo anterior debe hacerse como dos declaraciones y no una, por ejemplo $a = $array1 + $array2; ksort($a);, de lo contrario $resulting_array, será un valor booleano y no la matriz que esperaba.
El Yobo
3

Usando el mismo método que @mvpetrovich, puede usar la versión abreviada de una matriz para acortar la sintaxis.

$_array = array_merge(["key1" => "key_value"], $_old_array);

Referencias:

PHP: fusión_array ()

PHP: Matrices - Manual

A partir de PHP 5.4 también puede usar la sintaxis de matriz corta, que reemplaza matriz () con [].

Bryce Gough
fuente