本文作者的要求是保留键值(keep keys)并且不覆盖(我认为是指 overwrite)。在一些情况下,如数值键,这是可能的,但如果是字符串键,则似乎不可能。
如果使用 array_merge()
,则数字键将始终重新索引或重新编号。
如果使用 array_replace()
、array_replace_recursive()
,它将从右到左进行重叠或覆盖。第一个数组上具有相同键的值将被第二个数组替换。
如果使用 $array1 + $array2
,如评论中提到的,如果键相同,则将保留来自第一个数组的值,但放弃第二个数组。
自定义函数。
以下是我刚刚编写的函数,以满足相同的要求。您可以自由地将其用于任何目的。
function arrayCustomMerge(array $array1, array ...$arrays): array
{
foreach ($arrays as $additionalArray) {
foreach ($additionalArray as $key => $item) {
if (is_string($key)) {
$array1[$key] = $item;
} elseif (is_int($key) && !array_key_exists($key, $array1)) {
$array1[$key] = $item;
} else {
$array1Keys = array_filter(array_keys($array1), 'is_int');
$nextKeyIndex = (intval(max($array1Keys)) + 1);
unset($array1Keys);
$array1[$nextKeyIndex] = $item;
unset($nextKeyIndex);
}
}
unset($item, $key);
}
unset($additionalArray);
return $array1;
}
测试。
<?php
$array1 = [
'cat',
'bear',
'fruitred' => 'apple',
3 => 'dog',
null => 'null',
];
$array2 = [
1 => 'polar bear',
20 => 'monkey',
'fruitred' => 'strawberry',
'fruityellow' => 'banana',
null => 'another null',
];
function printDebug($message)
{
echo '<pre>';
print_r($message);
echo '</pre>' . PHP_EOL;
}
echo 'array1: <br>';
printDebug($array1);
echo 'array2: <br>';
printDebug($array2);
echo PHP_EOL . '<hr>' . PHP_EOL . PHP_EOL;
echo 'arrayCustomMerge:<br>';
$merged = arrayCustomMerge($array1, $array2);
printDebug($merged);
assert($merged[0] == 'cat', 'array key 0 should be \'cat\'');
assert($merged[1] == 'bear', 'array key 1 should be \'bear\'');
assert($merged['fruitred'] == 'strawberry', 'array key \'fruitred\' should be \'strawberry\'');
assert($merged[3] == 'dog', 'array key 3 should be \'dog\'');
assert(array_search('another null', $merged) !== false, '\'another null\' should be merged.');
assert(array_search('polar bear', $merged) !== false, '\'polar bear\' should be merged.');
assert($merged[20] == 'monkey', 'array key 20 should be \'monkey\'');
assert($merged['fruityellow'] == 'banana', 'array key \'fruityellow\' should be \'banana\'');
结果。
array1:
Array
(
[0] => cat
[1] => bear
[fruitred] => apple
[3] => dog
[] => null
)
array2:
Array
(
[1] => polar bear
[20] => monkey
[fruitred] => strawberry
[fruityellow] => banana
[] => another null
)
---
arrayCustomMerge:
Array
(
[0] => cat
[1] => bear
[fruitred] => strawberry
[3] => dog
[] => another null
[4] => polar bear
[20] => monkey
[fruityellow] => banana
)
array( 123 => "VALUE123" )
更改为array( 0 => "VALUE123" )
。 - Garrettassert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
- Bob Stein