Как это сделать, поэтому array_merge () перезаписывает два ключа с разными значениями, но тот же ключевой индекс из двух массивов?
например, слияние:
[0] => 'whatever'
с
[0] => 'whatever', [1] => 'a', [2] => 'b'
должен производить
[0] => 'whatever', [1] => 'a', [2] => 'b'
В основном я хочу, чтобы array_merge baave так же, как он ведет себя, если массивы имеют строковые ключи …
Используйте оператор +
.
Сравните оператор 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); ?>
Вывод:
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
в этом случае создает новый ключ. Нежелательно …
Довольно легко писать вручную:
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;
,
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 )
array_replace
делает именно это. См. http://php.net/manual/de/function.array-replace.php
Вы можете использовать array_merge()
а затем использовать 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 )
Сравните с НЕПРАВИЛЬНЫМ использованием "+"
$arrCommon = $arrA + $arrB; print_r($arrCommon); Array ( [0] => 10 [1] => 11 [2] => 12 )