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 ...
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 ...
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;
.
array_replace
fait exactement cela. Voir: http://php.net/manual/de/function.array-replace.php
function array_merge_custom()
{
$array = array();
$arguments = func_num_args();
foreach($arguments as $args)
foreach($args as $key => $value)
$array[$key] = $value;
return $array;
}
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
)
Vous pouvez utiliser array_merge()
, puis array_unique()
.
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));