2010-01-27 5 views
10

J'ai deux tableaux associatifs qui ont beaucoup de contenu même et donc je veux combiner ces deux tableaux de telle sorte que si j'ai a dans le tableau 1 et a dans le tableau 2 que dans le tableau 3, je devrais avoir des entrées pour a's et pas 1.Comment combiner 2 tableaux associatifs en PHP de sorte que nous n'écrivons pas d'entrées dupliquées dans tous les cas?

J'ai essayé d'utiliser array_merge mais il écraserait les entrées dans le 1er tableau s'il y a des doublons dans la 2e série, j'ai aussi essayé d'utiliser + mais il me donne une erreur fatale en disant Fatal error: Unsupported operand types in /home/code.php alors j'ai essayé de faire

(array)$ar3 = (array)$ar1 +(array)$ar2 et il semble ajouter. Je veux savoir est-ce la bonne façon de le faire et aussi pourquoi ai-je eu une erreur fatale et que cela a fonctionné comme j'avais déjà défini $ ar3, $ ar2, $ ar1 comme types de tableau.

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

Merci.

+0

Voir cette question connexe http://stackoverflow.com/questions/2140090/operator-for-array-in-php/2140094#2140094 – Gordon

+0

Vous sont totalement à droite d'utiliser '+', il va union deux tableaux: * "L'opérateur + ajoute des éléments des clés restantes du tableau droitier à la main gauche, tandis que les clés dupliquées sont ** NON ** écrasées." * http: //www.php.net/manual/fr/language.operators.array.php Pourquoi faut-il les lancer en tableau avant de ne pas savoir que vous avez peut-être un code bizarre;) –

+0

pouvez-vous ajouter la sortie de 'var_dump s'il vous plaît. raccourcissez-les quand ils sont très longs. – Gordon

Répondre

1

array_merge() va remplacer les doublons que si les deux tableaux contain the same string keys:

Si les tableaux d'entrée ont les mêmes touches de chaîne, la valeur plus tard pour cette clé remplacera l' précédent. Si, toutefois, les tableaux contiennent des clés numériques , la valeur ultérieure ne remplacera pas la valeur d'origine mais sera ajoutée.

Je crois que ce comportement est attendu. Comment vous gérer ce cas? Disons que

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

Quelle serait une sortie acceptable après la fusion de la matrice?

14

$array1 + $array2 retournera l'union des deux tableaux. Si elles sont associatives, les valeurs de l'opérande de gauche seront préférées si les clés entrent en collision. Par conséquent, ce n'est pas la solution que vous voulez car les valeurs seront perdues.

Il n'y a rien de mal à l'instruction à condition que les deux variables soient comprises comme des tableaux. Votre erreur fatale est probablement survenue car une variable était en fait un objet, et il est possible de le confondre avec var_dump. En ajoutant le type cast, vous avez forcé PHP à contraindre les deux variables à des tableaux. Si une variable est un objet, il aurait cet effet:

De l'PHP.net Manual

« Si un objet est converti en un tableau, le résultat est un tableau dont les éléments sont les propriétés de l'objet. les touches sont les noms de variables membres, avec quelques exceptions notables: les propriétés entières sont unaccessible; privés variables ont le nom de classe préfixé au nom de la variable; les variables protégées ont un « * » ajouté au nom de la variable. Ces valeurs préfixées ont des octets nuls sur de chaque côté."

Maintenant, avec deux tableaux à ajouter, PHP n'a rien à paniquer. Notez que tout en jetant les deux opérandes de + était important, il n'a pas de sens pour lancer la variable que vous assignez à. L'expression (array)$foo ne fonctionne pas modifier $ foo, mais retourne plutôt une nouvelle valeur Cela peut ne pas être intuitif dans les langages qui nécessitent la déclaration de variables, mais PHP n'est pas un tel langage

Sur votre autre problème, vous ne pouvez pas avoir deux clés identiques Cela rendrait impossible d'indexer le tableau car la valeur à retourner deviendrait ambiguë Si vous souhaitez combiner deux tableaux dans un manoir sans perte, vous devrez utiliser un structure ata.

Ma suggestion est d'utiliser un tableau de tableaux, où:

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

deuiendront:

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

Et l'ordre n'est pas déterminé. Le seul changement notable dans la structure est que toutes les premières valeurs sont des tableaux, ce qui permet d'accumuler des valeurs de clés dupliquées. Cette fonction fait la tâche et pourrait faire avec un meilleur nom:

// 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

Pouvez-vous expliquer ce que fait réellement cette fonction et comment éviter d'écraser les valeurs? – user260204

+0

La fonction fait exactement ce que j'ai décrit avec $ a1, $ a2 et $ a3. Les valeurs des clés dupliquées des tableaux constituants sont accumulées dans leur propre tableau plutôt que remplacées. Pour mieux comprendre comment cela se comporte, je recommande d'essayer la fonction avec vos propres données de test. – erisco

Questions connexes