+ operador para array en PHP?


192
$test = array('hi');
$test += array('test','oh');
var_dump($test);

¿Qué +significa para array en PHP?


55
Noté que su pregunta tenía +=y la respuesta aceptada sí +. Según mis pruebas, parecen comportarse igual.
user151841

77
La documentación lo resume bastante bien
artfulrobot


@RobbieAverill: esta es la pregunta a la que se refiere la pregunta de referencia. Entonces, si hay algo que la pregunta de referencia es el duplicado
icc97

2
¿Alguien más está un poco horrorizado de que haya que hacer algo tan fundamental como la concatenación de matrices array_merge? Es como si las matrices fueran por defecto matrices asociativas y las matrices numéricas fueran ciudadanos de segunda clase.
icc97

Respuestas:


271

Citando del Manual PHP sobre operadores de lenguaje

El operador + devuelve la matriz de la derecha añadida a la matriz de la izquierda; Para las claves que existen en ambas matrices, se utilizarán los elementos de la matriz de la izquierda y se ignorarán los elementos coincidentes de la matriz de la derecha.

Entonces si lo haces

$array1 = ['one',   'two',          'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz']; 

print_r($array1 + $array2);

Conseguirás

Array
(
    [0] => one   // preserved from $array1 (left-hand array)
    [1] => two   // preserved from $array1 (left-hand array)
    [foo] => bar // preserved from $array1 (left-hand array)
    [2] => five  // added from $array2 (right-hand array)
)

Entonces, la lógica de +es equivalente al siguiente fragmento:

$union = $array1;

foreach ($array2 as $key => $value) {
    if (false === array_key_exists($key, $union)) {
        $union[$key] = $value;
    }
}

Si está interesado en los detalles de la implementación de nivel C, diríjase a


Tenga en cuenta que eso +es diferente de cómo array_merge()combinaría las matrices:

print_r(array_merge($array1, $array2));

te daría

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => baz // overwritten from $array2
    [2] => three // appended from $array2
    [3] => four  // appended from $array2
    [4] => five  // appended from $array2
)

Ver páginas enlazadas para más ejemplos.


1
@Pacerier PHP producido por php.net no tiene una especificación formal, pero tanto el +y array_mergellamar zend_hash_mergebajo el capó. Esto también se espera, ya que en PHP las matrices se implementan como mapas hash ordenados.
obispo

1
@Pacerier Los documentos en línea de php.net son el registro más cercano a una especificación, pero IMO esos documentos están muy por debajo de una especificación verdadera: uno, se actualizan después de que se escribe el código; dos, no están escritos para cubrir cada uso especial.
obispo

14
El comportamiento de PHP +y array_mergees perverso y poco intuitivo. Son al revés de lo que una lectura en inglés simple le diría intuitivamente que haría 'agregar' o 'fusionar' matrices. Otros lenguajes / bibliotecas se utilizan +para concatenar listas (por ejemplo, en Python) y "fusionar" funciones para agregar los pares clave / valor de un objeto a otro (por ejemplo, en lodash). Sin embargo, en PHP es al revés; array_mergese puede usar para concatenar matrices tipo lista pero +no se puede. A diferencia array_merge, +siempre realiza la operación que se llamaría una "fusión" en cualquier otro idioma.
Mark Amery

1
@ icc97 de hecho son solo HashMaps. Ver nikic.github.io/2014/12/22/…
Gordon

2
Intenté enviar un error para ver si se array_concatpodía crear un alias array_merge.
icc97

18

El mejor ejemplo que encontré para usar esto es en una matriz de configuración.

$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"no-reply@domain.com");

$config = $user_vars + $default_vars;

El $default_vars, como sugiere, es la matriz de valores predeterminados. La $user_varsmatriz sobrescribirá los valores definidos en $default_vars. Los valores faltantes $user_varsahora son los valores predeterminados de $default_vars.

Esto sería print_rcomo:

Array(2){
    "username" => "John Doe",
    "email" => "no-reply@domain.com"
}

¡Espero que esto ayude!


6

Este operador toma la unión de dos matrices (lo mismo que array_merge, excepto que con array_merge se sobrescriben las claves duplicadas).

La documentación para los operadores de matriz se encuentra aquí .


1
Una advertencia para los principiantes aquí, el resultado de la operación es nulo si alguno de los arreglos es nulo . Es posible que algunos no se preocupen por esta suposición, ya que es una operación de unión, el resultado será la matriz adecuada (no nula) si una de ellas es nula. Pero, eso es cierto si una de las matrices es una matriz vacía .
Sandeepan Nath

Entonces, como una buena práctica, creo que deberíamos inicializar las matrices de entrada como matrices vacías. ¿Qué dicen ustedes?
Sandeepan Nath

5

Cuidado con las teclas numéricas, si deben conservarse o si no quieres perder nada

$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");

Unión

print_r($a+$b);
Array
(
    [2] => a2
    [4] => a4
    [5] => a5
    [1] => b1
    [3] => b3
)

unir

print_r(array_merge($a, $b));
Array
(
    [0] => a2
    [1] => a4
    [2] => a5
    [3] => b1
    [4] => b3
    [5] => b4
)

3

El +operador produce los mismos resultados que array_replace () . Sin embargo, dado que los argumentos del operador se invierten, el orden de la matriz resultante también puede ser diferente.

Ampliando otro ejemplo de esta página:

$array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz'); 

print_r($array1 + $array2);
print_r(array_replace($array2, $array1)); //note reversed argument order

salidas:

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => bar // preserved from $array1
    [2] => five  // added from $array2
)
Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [2] => five  // added from $array2
    [foo] => bar // preserved from $array1
)

¿Está el orden de +garantizado por las especificaciones? ¿Qué hay de array_replace?
Pacerier

1
  1. La operación de matriz más trata todas las matrices como una matriz asociada.
  2. Cuando el conflicto de teclas durante el signo más, el valor izquierdo (anterior) se mantendrá

Publico el código a continuación para aclarar las cosas.

$a + $b = array_plus($a, $b)

function array_plus($a, $b){
    $results = array();
    foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    return $results;
}

La ejecución del código de @ Tamlyn parece demostrar que su afirmación "la operación de matriz más trata a todas las matrices como matriz de asociación" es incorrecta.
Pacerier

@Pacerier esa clave también podría ser entera.
Hitesh


-4
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);

Matriz ([0] => ejemplo [1] => prueba)


1
Este hilo menciona algunas veces cómo array_merge () NO es congruente.
doublejosh

@doublejosh, "congruente"? ¿Sentido?
Pacerier

1
Ellos no son los mismos.
doublejosh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.