Объединение массива PHP с числовыми ключами
как сделать так, чтобы array_merge () перезаписывал два ключа с разными значениями, но с одинаковым индексом ключа из двух массивов?
например, слияние:
[0] => 'whatever'
С
[0] => 'whatever', [1] => 'a', [2] => 'b'
должно производить
[0] => 'whatever', [1] => 'a', [2] => 'b'
В основном я хочу, чтобы array_merge bahave так же, как он ведет себя, если массивы имеют строковые ключи...
8 ответов
использовать +
оператора.
сравнить array_merge
to +
оператор:
<?php
$a1 = array(0=>"whatever",);
$a2 = array(0=>"whatever",1=>"a",2=>"b");
print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>
выход:
Array
(
[0] => whatever
[1] => whatever
[2] => a
[3] => b
)
Array
(
[0] => whatever
[1] => a
[2] => b
)
на +
оператор еще работает, если ваш ассоциативный массив имеет числовые ключи вне порядка:
<?php
$a1 = array(0=>"whatever",);
$a2 = array(1=>"a",0=>"whatever",2=>"b");
print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>
выход:
Array
(
[0] => whatever
[1] => a
[2] => whatever
[3] => b
)
Array
(
[0] => whatever
[1] => a
[2] => b
)
обратите внимание array_merge
на этой case создает новый ключ. Не желательный...
довольно легко писать вручную:
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;
}
обновление: это ведет себя иначе, чем оператор объединения (return $first + $second;
), поскольку в этом случае второй массив выигрывает, когда оба имеют элементы с одним и тем же ключом.
однако, если вы переключаете места аргументов и размещаете массив, который вы хотите "выиграть" в случае конфликтов, как первый операнд, вы можете получить такое же поведение. Таким образом, функция выше ведет себя точно так же return $second + $first;
.
array_replace
делает именно это. Смотри: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;
}
вы должны использовать $a2+$a1
чтобы получить тот же результат с array_merge($a1,$a2);
$a1 = array(
'k1' => 1,
'k2' => 2,
'k3' => 3,
);
$a2 = array(
'k1' => 11,
'k2' => 22,
'k4' => 44,
);
код:
print_r(array_merge($a1,$a2));
выход:
Array (
[k1] => 11
[k2] => 22
[k3] => 3
[k4] => 44
)
код:
print_r($a1+$a2);
выход:
Array (
[k1] => 1
[k2] => 2
[k3] => 3
[k4] => 44
)
код:
print_r($a2+$a1);
выход:
Array (
[k1] => 11
[k2] => 22
[k4] => 44
[k3] => 3
)
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
)
сравнить неправильно использование "+"
$arrCommon = $arrA + $arrB;
print_r($arrCommon);
Array
(
[0] => 10
[1] => 11
[2] => 12
)