我有一个名为$arr = array
的数组。它的一些键具有价值,如下所示:
$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
现在我用另一个arry初始化那个数组,有点像这样:
$arr = array('4' => 'four', '5' => 'five');
但我需要保留以前的值。我的意思是,当我打印那个数组时,输出将是这样的:
echo '<pre>';
print_r($arr);
/* ---- output:
Array
(
[4] => four
[5] => five
)
*/
虽然我想要这个输出:
Array
(
[1] => one
[2] => two
[3] => three
[4] => four
[5] => five
)
那么,重新初始化后如何处理旧密钥(值)?
答案 0 :(得分:5)
以下是您的选项:array_merge,union(+运算符),array_push,只需直接设置键,然后使用您自己的自定义规则创建一个遍历数组的函数。
示例数据:
$test1 = array('1'=>'one', '2'=>'two', '3'=>'three', 'stringkey'=>'string');
$test2 = array('3'=>'new three', '4'=>'four', '5'=>'five', 'stringkey'=>'new string');
array_merge (如在其他答案中所见)将数字键(甚至数字字符串)重新索引回零并将新的数字索引附加到末尾。非数字字符串索引将使用后一个数组的值覆盖前一个数组中索引所在的值。
$combined = array_merge($test1, $test2);
结果(http://codepad.viper-7.com/c9QiPe):
Array
(
[0] => one
[1] => two
[2] => three
[stringkey] => new string
[3] => new three
[4] => four
[5] => five
)
union 将组合数组,但字符串和数字键的处理方式相同。将添加新索引,并且 NOT 将覆盖现有索引。
$combined = $test1 + $test2;
结果(http://codepad.viper-7.com/8z5g26):
Array
(
[1] => one
[2] => two
[3] => three
[stringkey] => string
[4] => four
[5] => five
)
array_push 允许您将键附加到数组。因此,只要新键是数字的并且按顺序排列,您就可以继续前进到数组的末尾。但请注意,后一个数组中的非数字字符串键将重新索引到现有数组+1中的最高数字索引。如果没有数字键,则为零。您还需要将每个新值作为单独的参数引用(请参阅下面的参数二和三)。此外,由于第一个参数是通过引用引入的,它将修改原始数组。其他选项允许您在需要原始数据时组合成单独的数组。
array_push($test1, 'four', 'five');
结果(http://codepad.viper-7.com/5b9nvC):
Array
(
[1] => one
[2] => two
[3] => three
[stringkey] => string
[4] => four
[5] => five
)
您也可以直接设置密钥。
$test1['4'] = 'four';
$test1['5'] = 'five';
或者甚至只是创建一个循环并将其包装在函数中以处理合并的自定义规则
function custom_array_merge($arr1, $arr2){
//loop over array 2
foreach($arr2 as $k=>$v){
//if key exists in array 1
if(array_key_exists($arr1, $k)){
//do something special for when key exists
} else {
//do something special for when key doesn't exists
$arr1[$k] = $v;
}
}
return $arr1;
}
可以扩展该函数以使用func_get_args之类的东西来允许任意数量的参数。
我确定还有更多&#34; hacky&#34;使用array_ splice或其他数组函数之类的方法来实现它。但是,IMO,我会避免它们只是为了让代码更清楚一些你在做什么。
答案 1 :(得分:4)
使用array_merge
:
$arr = array_merge($arr, array('4' => 'four', '5' => 'five'));
好吧,根据评论(这是正确的),这将重新索引数组,另一个解决方案是避免这样做:
array_push($arr, "four", "five");
但如果您有不同的键,例如没有屏蔽数字的字符串,这将无效。
另一种方法是使用+
来合并维护键:
$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
$arr2 = array('4' => 'four', '5' => 'five');
$arr = $arr + $arr2;
答案 2 :(得分:0)
另一种方法是使用array_replace。
,并保留数组的键$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
print_r(array_replace($arr, array('4' => 'four', '5' => 'five')));
输出:
Array
(
[1] => one
[2] => two
[3] => three
[4] => four
[5] => five
)