@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.
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.
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:
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)
@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.
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.
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
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.
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
La operación de matriz más trata todas las matrices como una matriz asociada.
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.
+=
y la respuesta aceptada sí+
. Según mis pruebas, parecen comportarse igual.array_merge
? Es como si las matrices fueran por defecto matrices asociativas y las matrices numéricas fueran ciudadanos de segunda clase.Respuestas:
Citando del Manual PHP sobre operadores de lenguaje
Entonces si lo haces
Conseguirás
Entonces, la lógica de
+
es equivalente al siguiente fragmento: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ómoarray_merge()
combinaría las matrices:te daría
Ver páginas enlazadas para más ejemplos.
fuente
+
yarray_merge
llamarzend_hash_merge
bajo el capó. Esto también se espera, ya que en PHP las matrices se implementan como mapas hash ordenados.+
yarray_merge
es 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_merge
se puede usar para concatenar matrices tipo lista pero+
no se puede. A diferenciaarray_merge
,+
siempre realiza la operación que se llamaría una "fusión" en cualquier otro idioma.array_concat
podía crear un aliasarray_merge
.El mejor ejemplo que encontré para usar esto es en una matriz de configuración.
El
$default_vars
, como sugiere, es la matriz de valores predeterminados. La$user_vars
matriz sobrescribirá los valores definidos en$default_vars
. Los valores faltantes$user_vars
ahora son los valores predeterminados de$default_vars
.Esto sería
print_r
como:¡Espero que esto ayude!
fuente
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í .
fuente
Cuidado con las teclas numéricas, si deben conservarse o si no quieres perder nada
Unión
unir
fuente
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:
salidas:
fuente
+
garantizado por las especificaciones? ¿Qué hay dearray_replace
?Publico el código a continuación para aclarar las cosas.
$a + $b = array_plus($a, $b)
fuente
Agregará la nueva matriz a la anterior.
fuente
Matriz ([0] => ejemplo [1] => prueba)
fuente