Php 如何在新赋值后保留数组中以前的值?
我有一个名为$arr=array的数组。它的某些键具有值,如下所示:Php 如何在新赋值后保留数组中以前的值?,php,arrays,Php,Arrays,我有一个名为$arr=array的数组。它的某些键具有值,如下所示: $arr['1'] = 'one'; $arr['2'] = 'two'; $arr['3'] = 'three'; $arr = array('4' => 'four', '5' => 'five'); echo '<pre>'; print_r($arr); /* ---- output: Array ( [4] => four [5] => fiv
$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
$arr = array('4' => 'four', '5' => 'five');
echo '<pre>';
print_r($arr);
/* ---- output:
Array
(
[4] => four
[5] => five
)
*/
现在我用另一个arry初始化该数组,类似这样的东西:
$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
$arr = array('4' => 'four', '5' => 'five');
echo '<pre>';
print_r($arr);
/* ---- output:
Array
(
[4] => four
[5] => five
)
*/
但我需要保留以前的值。我的意思是,当我打印该数组时,输出将如下所示:
$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
$arr = array('4' => 'four', '5' => 'five');
echo '<pre>';
print_r($arr);
/* ---- output:
Array
(
[4] => four
[5] => five
)
*/
那么,在重新初始化后如何处理旧的键值呢?使用array\u merge:
好的,根据正确的注释,这将重新为数组编制索引,另一个避免这种情况的解决方案是如下操作:
$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
$arr2 = array('4' => 'four', '5' => 'five');
$arr = $arr + $arr2;
但是,如果您有不同的键,例如不是掩码数字的字符串,那么这将不起作用
另一种方法是使用+来合并它们,以保持关键点:
$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
print_r(array_replace($arr, array('4' => 'four', '5' => 'five')));
另一种方法是使用 输出:
$test1 = array('1'=>'one', '2'=>'two', '3'=>'three', 'stringkey'=>'string');
$test2 = array('3'=>'new three', '4'=>'four', '5'=>'five', 'stringkey'=>'new string');
下面详细介绍了您的选项:array\u merge、union+操作符、array\u push,只需直接设置键,并使用您自己的自定义规则创建一个函数,在数组上循环 样本数据:
$combined = array_merge($test1, $test2);
如其他答案中所示,array_merge会将数字键甚至数字字符串重新索引回零,并在末尾附加新的数字索引。非数字字符串索引将用后一个数组的值覆盖前一个数组中存在索引的值
Array
(
[0] => one
[1] => two
[2] => three
[stringkey] => new string
[3] => new three
[4] => four
[5] => five
)
结果:
并集将组合数组,但字符串键和数字键的处理方式相同。将添加新索引,而不会覆盖现有索引
Array
(
[1] => one
[2] => two
[3] => three
[stringkey] => string
[4] => four
[5] => five
)
结果:
array\u push允许将键附加到数组中。因此,只要新的键是数字的并且按顺序排列,就可以将其推到数组的末尾。但是请注意,后一个数组中的非数字字符串键将被重新索引到现有数组中的最高数字索引+1。如果没有数字键,则为零。您还需要将每个新值作为单独的参数引用,请参见下面的参数2和参数3。此外,由于第一个参数是通过引用引入的,因此它将修改原始数组。其他选项允许您在需要原始阵列时合并到单独的阵列
Array
(
[1] => one
[2] => two
[3] => three
[stringkey] => string
[4] => four
[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;
}
甚至只是做一个循环并将其包装在一个函数中,以处理合并的自定义规则
该函数可以扩展为使用诸如允许任意数量的参数之类的东西
我相信还有更多的黑客方法可以使用类似于数组或其他数组函数的东西来实现。但是,在我看来,我会避免使用它们,只是为了让代码更清楚地了解您在做什么。这是什么意思:我用另一个数组初始化该数组为什么您不能只初始化初始数组?^。这比array_merge好,因为索引键被覆盖array merge将重置键,如果它们是数字,甚至是伪装成数字的字符串。这将重新索引从零开始的数组。数组并集将不可用。这将无法按预期工作。它会像@JonathanKuhn说的那样改变按键。我不是想指出显而易见的,我只是不明白为什么需要提供一个已经给出的答案。我提供了所有的替代方法。@Abracadver实际上我想问,你真的为什么要删除你的答案?!太棒了…,我将使用+组合我的两个数组。你能在你的答案中添加push\u数组的行为吗?@Sajad添加了array\u push
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;
}