Fusion de tableaux PHP avec des clés numériques

Comment faire pour que array_merge() écrive deux clés avec des valeurs différentes mais le même index de clé de deux tableaux?

par exemple, Fusion:

[0] => 'whatever'

avec

[0] => 'whatever', [1] => 'a', [2] => 'b'

doit produire

[0] => 'whatever', [1] => 'a', [2] => 'b'

fondamentalement, je veux que array_merge soit bahave de la même façon qu'il se comporte si les tableaux ont des clés de chaîne...

33
demandé sur Alex 2011-05-08 23:09:35

8 réponses

utilisez l'opérateur + .

comparer array_merge à + opérateur:

<?php

$a1 = array(0=>"whatever",);
$a2 = array(0=>"whatever",1=>"a",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

sortie:

Array
(
    [0] => whatever
    [1] => whatever
    [2] => a
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

Le + opérateur encore fonctionne si votre tableau associatif a l'aide des touches numériques out-of-order":

<?php

$a1 = array(0=>"whatever",);
$a2 = array(1=>"a",0=>"whatever",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

sortie:

Array
(
    [0] => whatever
    [1] => a
    [2] => whatever
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

Avis array_merge dans ce affaire crée une nouvelle clé. Pas souhaitable...

68
répondu AJ. 2011-05-08 19:17:16

assez facile à écrire manuellement:

function array_merge_custom($first, $second) {
    $result = array();
    foreach($first as $key => $value) {
        $result[$key] = $value;
    }
    foreach($second as $key => $value) {
        $result[$key] = $value;
    }

    return $result;
}

mise à Jour: il se comporte différemment que l'opérateur union ( return $first + $second; ) car dans ce cas le deuxième tableau de victoires lorsque les deux éléments avec la même clé.

cependant, si vous changez les lieux des arguments et placez le tableau que vous voulez "gagner" en cas de conflits comme le premier opérande, vous pouvez obtenir le même comportement. Donc la fonction ci-dessus se comporte exactement comme return $second + $first; .

7
répondu Jon 2011-05-08 19:14:34

array_replace fait exactement cela. Voir: http://php.net/manual/de/function.array-replace.php

5
répondu HKandulla 2017-05-17 13:31:19
function array_merge_custom()
{
    $array      = array();
    $arguments  = func_num_args();
    foreach($arguments as $args)
        foreach($args as $key => $value)
            $array[$key] = $value;
    return $array;
}
3
répondu Manvel 2012-01-08 21:42:28

vous devez utiliser $a2+$a1 pour obtenir le même résultat avec array_merge($a1,$a2);

$a1 = array(
    'k1' => 1,
    'k2' => 2,
    'k3' => 3,
);

$a2 = array(
    'k1' => 11,
    'k2' => 22,
    'k4' => 44,
);

Code:

print_r(array_merge($a1,$a2));

sortie:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k3] => 3 
    [k4] => 44 
)

Code:

print_r($a1+$a2);

sortie:

Array ( 
    [k1] => 1 
    [k2] => 2 
    [k3] => 3 
    [k4] => 44 
)

Code:

print_r($a2+$a1);

sortie:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k4] => 44 
    [k3] => 3 
) 
2
répondu Göktuğ Öztürk 2014-01-21 14:54:00

vous pouvez utiliser array_merge() et ensuite utiliser array_unique() .

0
répondu Scott C Wilson 2011-05-08 19:16:40
the solution could be this:
function array_merge_custom($array1, $array2) {
    $mergeArray = [];
    $array1Keys = array_keys($array1);
    $array2Keys = array_keys($array2);
    $keys = array_merge($array1Keys, $array2Keys);

    foreach ($keys as $key) {
        $mergeArray[$key] = array_merge_recursive(isset($array1[$key]) ? $array1[$key] : [], isset($array2[$key]) ? $array2[$key] : []);
    }

    return $mergeArray;
}

$array1 = [
    '66_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    '67_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    '68_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    68 => [
        'k1' => 1,
        'k2' => 1,
    ]
];
$array2 = [
    '66_' => [
        'a1' => 1,
        'a2' => 1,
    ],
    '68_' => [
        'b1' => 1,
        'b2' => 1,
    ],
    68 => [
        'b1' => 1,
        'b2' => 1,
    ]
];
echo '<pre>';
print_r(array_merge_custom($array1, $array2));
0
répondu phvish 2014-09-17 05:57:36
$arrA = [10, 11, 12];
$arrB = [12, 13];

$arrCommon = array_keys(array_flip($arrA) + array_flip($arrB));

print_r($arrCommon);
Array
(
    [0] => 10
    [1] => 11
    [2] => 12
    [3] => 13
)

comparer à faux utilisation de " + "

$arrCommon = $arrA + $arrB;

print_r($arrCommon);
Array
(
    [0] => 10
    [1] => 11
    [2] => 12
)
-1
répondu Sergey Onishchenko 2017-08-04 13:30:24