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...
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...
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;
.
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 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
)
vous pouvez utiliser array_merge()
et ensuite utiliser 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));
$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
)