web-dev-qa-db-fra.com

PHP array_merge avec des clés numériques

Comment peut-il en être ainsi array_merge () écrase deux clés avec des valeurs différentes mais le même index de deux tableaux?

par exemple, fusionner:

[0] => 'whatever'

avec

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

devrait produire

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

En gros, je veux que array_merge ait le même comportement que si les tableaux avaient des clés de chaîne ...

35
Alex

Utilisez l'opérateur +.

Comparer l'opérateur array_merge à +:

<?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
)

L'opérateur + still fonctionne si votre tableau associatif a les clés numériques hors d'usage:

<?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 this case crée une nouvelle clé. Pas souhaitable ...

71
AJ.

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: Cela se comporte différemment de l'opérateur d'union (return $first + $second;) car, dans ce cas, le tableau second gagne lorsque les deux ont des éléments avec la même clé.

Cependant, si vous changez l'emplacement des arguments et placez le tableau que vous voulez "gagner" en cas de conflit avec l'opérande first, vous pouvez obtenir le même comportement. Donc, la fonction ci-dessus se comporte exactement comme return $second + $first;.

7
Jon

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

5
HKandulla
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
Manvel

Vous devriez 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
Göktuğ Öztürk

Vous pouvez utiliser array_merge(), puis array_unique().

0
Scott C Wilson
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
phvish