web-dev-qa-db-fra.com

PHP combinez deux tableaux associatifs en un seul tableau

$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

J'ai besoin d'un nouveau tableau combinant tous les éléments, c'est-à-dire

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

Quelle est la meilleure façon de procéder?

Désolé, j'ai oublié, les identifiants ne seront jamais identiques, mais techniquement, les noms pourraient être, mais ne seraient probablement pas probables, et ils doivent tous être répertoriés dans un tableau. J'ai consulté array_merge mais je ne savais pas si c'était la meilleure façon de le faire. Aussi, comment voulez-vous que l'unité teste cela?

57
jsteinmann

array_merge() est plus efficace, mais il existe plusieurs options:

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
93
Samuel Cook

Départ array_merge() .

$array3 = array_merge($array1, $array2);
20
Brad

Une autre option est array_replace , où un tableau d'origine est modifié par d'autres tableaux:

  • Les mêmes clés feront que les valeurs suivantes remplaceront le tableau d'origine
  • De nouvelles clés sur les tableaux suivants seront créées sur le tableau d'origine.

Cela signifie que l'association key => value est préservée et qu'aucune clé dupliquée n'est insérée.

6
wranvaud

J'utilise un wrapper autour de array_merge pour traiter le commentaire de SeanWM à propos des tableaux nuls; Je veux aussi parfois me débarrasser des doublons. De manière générale, je souhaite également fusionner un tableau dans un autre, par opposition à la création d'un nouveau tableau. Cela finit comme:

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}
2
xgretsch

Je sais que c’est une vieille question, mais j’aimerais ajouter un cas supplémentaire avec les requêtes de pilote MongoDB que j’avais eues récemment et aucun des array_merge, array_replace ni array_Push n’a fonctionné. J'avais une structure un peu complexe d'objets encapsulés sous forme de tableaux dans tableau:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

Et je devais les fusionner en gardant la même structure comme ceci:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

La meilleure solution que j'ai trouvée était la suivante:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
0
JohnPan
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

S'il s'agit d'un tableau associatif numérique mais non séquentiel, vous devez utiliser array_replace

0
tom10271

Je suis tombé sur cette question en essayant d'identifier un moyen propre de rejoindre deux tableaux d'assoc. 

J'essayais de rejoindre deux tables différentes qui n'avaient pas de relations l'une avec l'autre.

C'est ce que j'ai proposé pour PDO Query en joignant deux tables. Samuel Cook est ce qui a identifié une solution pour moi avec la array_merge() +1 pour lui.

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

Cela aidera peut-être quelqu'un d'autre.

0
Kray