Anteponer elementos de matriz asociativa a una matriz asociativa

3 minutos de lectura

Avatar de usuario de Colin Brock
colin brock

¿Es posible anteponer una matriz asociativa con pares literales de 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');

  • Ver también: Diferencias entre array_replace() y array_merge() y + (operador de unión de matriz)

    – mickmackusa

    10 de noviembre a las 22:48


¿No puedes simplemente hacer:

$resulting_array = $array2 + $array1;

?

  • Ver también array_merge() y su diferencia con el uso del operador +: br.php.net/manual/en/function.array-merge.php#92602

    – Havenard

    3 de septiembre de 2009 a las 1:33

  • @cletus: Vaya. Sí puedo. No estoy seguro de qué me hizo pensar que no podía o qué no funcionaba antes. Gracias por la respuesta.

    – ColinBrock

    3 de septiembre de 2009 a las 1:36

  • Vale la pena notar 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

    3 de septiembre de 2009 a las 1:37

Avatar de usuario de PHPguru
PHPgurú

No puede anteponer directamente 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á abajo.

$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.

  • “sobrescribe las claves y no conserva las claves numéricas”… a) ¿cómo maneja el operador de unión (“+”) las claves “duplicadas”? re: no preservar las teclas numéricas: probablemente deseado

    – Brad Kent

    28 de mayo de 2019 a las 2:35

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(), utilice de nuevo array_merge():

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

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: array_merge()

PHP: Matrices – Manual

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

avatar de usuario de karim79
karim79

@Cletus es perfecto. Solo para agregar, si el orden de los elementos en las matrices de entrada es ambiguo, y necesita ordenar la matriz final, es posible que desee sortear:

$resulting_array = $array1 + $array2;
ksort($resulting_array);

  • Como nota tardía, ksort devuelve booleano, por lo que lo anterior debe hacerse como dos declaraciones, no como una, por ejemplo $a = $array1 + $array2; ksort($a);de lo contrario $resulting_array será un valor booleano, no la matriz que esperaba.

    – El Yobo

    17/10/2011 a las 22:39

Avatar de usuario de Toby Allen
toby allen

Si usa Laravel, puede usar anteponer en una instancia de colección

 collect(['b' => 'b', 'c' => 'c'])->prepend('a','a');

// ['a'=>'a', 'b' => 'b', 'c' => 'c']

https://laravel.com/docs/9.x/collections#method-prepend

  • Como nota tardía, ksort devuelve booleano, por lo que lo anterior debe hacerse como dos declaraciones, no como una, por ejemplo $a = $array1 + $array2; ksort($a);de lo contrario $resulting_array será un valor booleano, no la matriz que esperaba.

    – El Yobo

    17/10/2011 a las 22:39

¿Ha sido útil esta solución?