php - concatenar - Array_merge versus+
concatenar arrays php (2)
Esta pregunta ya tiene una respuesta aquí:
Cuando uso array_merge()
con matrices asociativas obtengo lo que quiero, pero cuando las uso con matrices de claves numéricas, las claves cambian.
Con +
las claves se conservan pero no funciona con matrices asociativas.
No entiendo cómo funciona esto, ¿alguien me puede explicarlo?
Debido a que ambas matrices están indexadas numéricamente, solo se usarán los valores en la primera matriz.
El operador + devuelve la matriz de la derecha anexa a la matriz de la izquierda; para las claves que existen en ambas matrices, se usarán los elementos de la matriz de la izquierda y se ignorarán los elementos coincidentes de la matriz de la derecha.
http://php.net/manual/en/language.operators.array.php
array_merge()
tiene un comportamiento ligeramente diferente:
Si las matrices de entrada tienen las mismas claves de cadena, el valor posterior de esa tecla sobrescribirá la anterior. Sin embargo, si las matrices contienen claves numéricas, el valor posterior no sobrescribirá el valor original, sino que se agregará. Los valores en la matriz de entrada con las teclas numéricas se renumerarán con las teclas de incremento comenzando desde cero en la matriz de resultados.
Estas dos operaciones son totalmente diferentes.
array plus
- La operación Array plus trata a todas las matrices como una matriz assoc.
- Cuando se mantenga el conflicto clave durante el más, el valor izquierdo (anterior)
null + array()
generará un error fatalarray_merge ()
- array_merge () funciona diferente con index-array y assoc-array.
- Si ambos parámetros son index-array, array_merge () concat index-array values.
- De lo contrario, el conjunto de índices se convertirá en una matriz de valores y luego convertirá en una matriz assoc.
- Ahora tiene dos array assoc y los fusiona, cuando se mantiene el conflicto clave, el valor correcto (último).
array_merge(null, array())
devuelve array () y recibió una advertencia, el parámetro # 1 no es una matriz.
Publiqué el código a continuación para aclarar las cosas.
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;
}
//----------------------------------------------------------------
function is_index($a){
$keys = array_keys($a);
foreach($keys as $key) {
$i = intval($key);
if("$key"!="$i") return false;
}
return true;
}
function array_merge($a, $b){
if(is_index($a)) $a = array_values($a);
if(is_index($b)) $b = array_values($b);
$results = array();
if(is_index($a) and is_index($b)){
foreach($a as $v) $results[] = $v;
foreach($b as $v) $results[] = $v;
}
else{
foreach($a as $k=>$v) $results[$k] = $v;
foreach($b as $k=>$v) $results[$k] = $v;
}
return $results;
}