2010-01-27 10 views
10

Tengo dos matrices asociativas que tienen muchos contenidos iguales y por eso quiero combinar esas dos matrices de forma que si tengo a en la matriz 1 y a en la matriz 2 que en la matriz 3, debería tener entradas tanto para a's como 1. no¿Cómo combinar 2 matrices asociativas en php para que no sobrescribamos ninguna entrada duplicada en todos los casos?

he intentado usar array_merge pero sería sobrescribir las entradas en la primera serie si hay duplicados en segunda matriz, también he intentado usar + pero me da error fatal diciendo Fatal error: Unsupported operand types in /home/code.php entonces intentado hacer

(array)$ar3 = (array)$ar1 +(array)$ar2 y parece sumarse. Quiero saber si esta es la forma correcta de hacerlo y también por qué al principio obtuve un error fatal y que funcionó ya que ya había definido $ ar3, $ ar2, $ ar1 como tipos de matriz.

$orders = new Order(); 
$prospectOffers = $orders->getOrder($orderConfNumber); 
$prospectOffersResult = json_decode($prospectOffers,true); 
$shoppingBasket = $cart->getCartItems(); 
var_dump($prospectOffersResult); // Both are arrays 
var_dump($shoppingBasket); //Both are arrays 
(array)$result = (array)$prospectOffersResult+(array)$shoppingBasket; 

Thanks.

+0

Ver esta pregunta relacionada http://stackoverflow.com/questions/2140090/operator-for-array-in-php/2140094#2140094 – Gordon

+0

Usted son totalmente correctas para usar '+', unirá dos matrices: * "El operador + agrega elementos de las teclas restantes de la matriz de la mano derecha a la mano izquierda, mientras que las teclas duplicadas están ** NO ** sobrescritas." * http: //www.php.net/manual/en/language.operators.array.php ¿Por qué tienes que convertirlos en una matriz antes de no saber si tienes un código extraño?) –

+0

puedes agregar la salida de 'var_dump 'por favor. acortarlos cuando son muy largos. – Gordon

Respuesta

1

array_merge() anulará duplicados sólo si ambas matrices contain the same string keys:

Si las matrices de entrada tienen las mismas claves de cadena, el valor más adelante para clave reemplazará la anterior uno. Sin embargo, si los arreglos contienen claves numéricas , el valor posterior no sobrescribirá el valor original, pero se agregará .

Creo que se espera que este comportamiento. ¿Cómo manejaría este caso usted? Digamos que

$arr1 = array('a' => 1); 
$arr2 = array('a' => 2); 

¿Cuál sería una salida aceptable después de la combinación de matrices?

14

$array1 + $array2 devolverá la unión de las dos matrices. Si son asociativos, los valores del operando izquierdo serán preferidos si las teclas colisionan. Por lo tanto, esta no es la solución que desea ya que los valores se perderán.

No hay nada de malo en la declaración siempre que ambas variables se entiendan como matrices. Su error fatal probablemente ocurrió porque una variable era en realidad un objeto, y es posible confundir eso usando var_dump. Al agregar los moldes de tipo, forzó a PHP a forzar ambas variables a las matrices. Si una variable era un objeto, tendría este efecto:

Desde el PHP.net Manual

"Si un objeto se convierte en una matriz, el resultado es una matriz cuyos elementos son las propiedades del objeto. las claves son los nombres de las variables miembro, y pocas excepciones notables: enteros propiedades son inaccesibles; variables privadas tienen el nombre de la clase antes del nombre de la variable; las variables protegidas tienen un '*' antepuesto al nombre de la variable. Estos valores anexados tienen bytes nulos en en ambos lados."

Ahora que tiene dos matrices para agregar, PHP no tenía nada para entrar en pánico. Tenga en cuenta que mientras se lanzan los dos operandos de + era importante, no tenía sentido convertir la variable que estaban asignando a. La expresión (array)$foo no lo hace modifique $ foo, pero devuelve un nuevo valor. Esto puede no ser intuitivo desde los idiomas que requieren que declare las variables, pero PHP no es un idioma.

En su otro problema, no puede tener dos de la misma clave en una matriz. Esto haría que sea imposible indexar la matriz, ya que el valor correcto para volver se volvería ambiguo. Si desea combinar dos matrices en una mansión sin pérdidas, tendrá que usar una d más complicada. ata estructura.

Mi sugerencia es utilizar una matriz de matrices, donde:

$a1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$a2 = array('a' => 3, 'b' => 2, 'd' => 2); 

se convertirá en:

$a3 = array(
    'a' => array(1, 3), 
    'b' => array(2, 2), 
    'c' => array(3), 
    'd' => array(2) 
); 

Y el pedido no está determinada. El único cambio notable en la estructura es que todos los primeros valores son matrices, lo que permite acumular valores de claves duplicadas. Esta función hace la tarea y podría hacer con un nombre mejor:

// array(array) lossless_array_merge([$array1 [, $array2 [, $...]]]) 

function lossless_array_merge() { 
    $arrays = func_get_args(); 
    $data = array(); 
    foreach ($arrays as $a) { 
    foreach ($a as $k => $v) { 
     $data[$k][] = $v; 
    } 
    } 
    return $data; 
} 
+0

¿Puede explicar qué está haciendo realmente esta función y cómo evita sobrescribir los valores? – user260204

+0

La función hace exactamente lo que describí con $ a1, $ a2 y $ a3. Los valores de las claves duplicadas de las matrices constituyentes se acumulan en su propia matriz en lugar de sobrescribirse. Para comprender mejor cómo se comporta, recomiendo probar la función con sus propios datos de prueba. – erisco

Cuestiones relacionadas